У приложения Windows сценарий работы программы выглядит иначе. Управление программой осуществляется не вызовами функций из основной функции WinMainO, а выполнением обработчиков событий. Запущенное приложение работает до тех пор, пока не получит сообщение WM_QUIT, сигнализирующее о том, что приложению следует закончить работу.
Синтаксис объявления функции WinMain приведен ниже.
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nShowCmd);
Параметры функции рассматриваются в следующем списке.
? hlnstance – уникальный идентификатор запускаемого экземляра приложения.
? hPrevInstance – уникальный идентификатор предыдущего запущенного экземпляра приложения. Для Pocket PC этот параметр всегда имеет значение NULL.
? lpCmdLine – строка, представляющая собой копию командной строки, при помощи которой было запущено приложение. При помощи этого параметра разработчик может обрабатывать информацию, переданную из командной строки.
? nShowCmd – целочисленная константа, определяющая, как именно основное окно приложения будет показано после запуска. Ее возможные значения перечислены в табл. 4.5.
Таблица 4.5. Параметры запуска приложения
В качестве возвращаемого значения функция WinMainO возвращает целочисленную константу, переданную ей как wParam сообщения WM_QUIT.
Объявление и реализация функций
В стандарте C++ для того, чтобы объявить и реализовать функцию, необходимо разместить как объявление функции, так и реализацию. Реализация и прототип отличаются друг от друга только наличием тела функции, другими словами, реализация – это прототип с телом функции.
Однако при компиляции приложений в eVC по умолчанию правила не так строги, и разработчик может использовать функции как с объявлением прототипа, так и без него.
Упражнение 4.7 (продолжение)
5. В файл advance.срр необходимо внести некоторые изменения. Так, в коде функции WndProc, в блоке обработки сообщения IDM_HELP_ABOUT нужно закрыть комментариями имеющийся код, и добавить одну строку.
MessageBox(hWnd, MyFunk1(), TEXT("MAMA "), 0);
Этот код выводит на экран сообщение, текст которого будет получен как возвращаемое значение функции MyFunkK).
6. Сразу после функции WndProc объявить и определить функцию MyFunkl, как показано в листинге 4.32.
Листинг 4.32
LPCTSTR MyFunk1(){
return (LPCTSTR)TEXT(«MUMU»);
}
7. Запустить программу на выполнение. Вместо этого будет отображено сообщение об ошибке, указывающее, что идентификатор MyFunkl неизвестен. Это позволяет убедиться, что несмотря на достаточную свободу объявления имени функции, это имя все-таки должно быть объявлено раньше, чем оно будет использовано. Поэтому можно либо перенести набранный код функции и поместить его перед WndProc, а можно оставить код на месте и перед WndProc поместить только прототип функции:
LPCTSTR MyFunk1();
8. После установки прототипа перед вызовом функции MyFunkl компиляция будет проходить нормально. Проект будет запущен, и при выполнении команды меню Tools ? About на экран будет выведено сообщение MUMU.
9. Теперь нужно усложнить пример, чтобы показать, как происходит объявление и вызов функции из другого модуля. Для этого нужно добавить к проекту еще один файл исходного кода (File ? New ? Files ? C++ Source File) с именем modl.cpp. Помимо него потребуется еще один заголовочный файл (File ? New ? Files ? С\С++ Header File) с именем modl.h.
10. В файле modl.h нужно объявить новую функцию, как это показано в листинге 4.33.
Листинг 4.33
#ifndef __MOD1_H__
#define __MOD1_H__
LPCTSTR MyFunk2(int x, LPCTSTR y);
#endif //__MOD1_H__
На самом деле, в этом случае можно было обойтись и без процедур препроцессора. Проект очень прост, и вероятность повторного включения данного заголовка в другой модуль просто отсутствует. Однако этот код приведен как пример применения данной директивы.
11. В файле modl.cpp написать реализацию этой функции, как это показано в листинге 4.34.
Листинг 4.34
#include «stdafx.h»
#include «mod1.h»
#include
wchar_t strA[512];
wchar_t strB[5];
wchar_t *str1 = strA;
wchar_t *str2 = strB;
LPCTSTR MyFunk2(int x, LPCTSTR y){
str2 = wcscpy(str2, y);
for (int i = 0; i
wcscat(str1, str2);
wcscat(str1, TEXT(" "));
}
return LPCTSTR(str1);
};
12. Чтобы данную функцию можно было вызвать из основного модуля программы advance.срр, в него надо включить ссылку на файл modl.h, сделав это в начале кода, как это показано в листинге 4.35. Листинг 4.35
#include «stdafx.h»
#include «advance.h»
#include «mod1.h»
13. И, наконец, надо вызвать эту функцию. Для этого нужно изменить реализацию функции MyFunkl, как это показано в листинге 4.36. Листинг 4.36
LPCTSTR MyFunk1(){
return (LPCTSTR)MyFunk2(25, (LPCTSTR)TEXT(«MUMU»));
}
14. Запущенная программа теперь выведет в сообщении слово MUMU 25 раз. Спецификаторы extern и static
Читать дальше
Конец ознакомительного отрывка
Купить книгу