Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП01_Окна_Создание приложения Win32.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
486 Кб
Скачать

4. Главная функция приложения

Приложения всегда описывают функцию с именем WinMain. Она получает управление при запуске приложения, выполняет присущие обычным функциям действия, регистрирует классы окон, создает окна, опрашивает очередь сообщений и распределяет свои сообщения.

Пример описания функции WinMain:

int WINAPI WinMain( HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpszCmdLine,

int nCmdShow)

{

MSG msg;

HWND hwnd;

if (!RegClass(WndProc, szClassName))

return FALSE;

hwnd = CreateWindow(szClassName, "Пример 1",

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, 0, 0, hInstance,NULL);

if (!hwnd) return FALSE;

ShowWindow( hwnd, SW_SHOWMAXIMIZED);

UpdateWindow(hwnd);

while (GetMessage(&msg, 0, 0,0))

{ TranslateMessage(&msg); DispatchMessage(&msg); }

return msg.wParam;

}

Имя, тип возврата и список формальных параметров функции определены требованиями Windows API. Модификатор WINAPI указывает на то, что функция при получении аргументов сама должна откорректировать порядок расположения аргументов в стеке.

Параметр hInstance от операционной системы получает дескриптор текущего экземпляра приложения. Параметр hPrevInstance в 16-разрядных приложениях указывает на активный предыдущий экземпляр приложения или NULL. В приложениях Win32 он всегда равен NULL и по нему невозможно узнать о существовании других активных экземпляров этого приложения. Параметр lpszCmdLine указывает на строку с аргументами командной строки запуска приложения. При обычном запуске этот параметр равен NULL. Параметр nCmdShow передает приложению способ начального отображения окна.

В теле функции WinMain описаны переменные msg и hwnd. Переменная msg предназначена для временного хранения сообщений при их получении и распределении. Переменная hwnd хранит дескриптор созданного окна.

Сообщение msg представляет собой структуру типа MSG:

typedef struct

{

HWND hwnd; //Дескриптор окна-адресата

UINT message; //Код сообщения

WPARAM wParam; //Содержимое сообщения

LPARAM lParam; //Содержимое сообщения

DWORD time; //Время отправления

POINT pt; //Координаты места отправления

} MSG; //Имя типа

Для регистрации класса окон вызывают функцию RegClass:

if (!RegClass(WndProc, szClassName)) return FALSE;

Для создания окна вызвана функция CreateWindow. Если окно не создано, приложение завершает свою работу.

Следующий после создания окна шаг выполняют не всегда. В данном примере окно не имеет стиля WS_VISIBLE и создано только в памяти. Для отображения окна вызывают функцию ShowWindow:

ShowWindow( hwnd, SW_SHOWMAXIMIZED);

Эта функция переводит окно hwnd в состояние, определяемое вторым параметром. Здесь окно hwnd отображают в максимально распахнутом виде.

Следующая функция сообщает функции окна hwnd о необходимости "перерисовки" рабочей области:

UpdateWindow(hwnd);

Далее следует цикл, который называется циклом обработки сообщений:

while (GetMessage(&msg, 0, 0, 0))

{ TranslateMessage(&msg); DispatchMessage(&msg); }

Здесь функция GetMessage выбирает сообщение из очереди сообщений приложения, TranslateMessage транслирует клавиатурные сообщения, DispatchMessage распределяет сообщения по функциям окон. Именно здесь происходит "вызов" функции окна.

Рассмотрим прототипы вышеперечисленных функций.

Функция ShowWindow объявлена следующим образом:

BOOL ShowWindow( HWND hwnd, int nCmdShow );

При первом после запуска приложения ее вызове вторым аргументом можно передать значение формального параметра nCmdShow функции WinMain. В последующих вызовах вторым аргументом вызова нужно указывать одну из констант следующей таблицы:

Константа

Действие функции ShowWindow

SW_HIDE

Скрывает окно hwnd и активизирует другое окно

SW_MAXIMIZE

Максимизирует окно

SW_MINIMIZE

Сворачивает окно hwnd и активизирует расположенное под ним окно

SW_RESTORE

Восстанавливает свернутое окно hwnd

SW_SHOW

Активизирует окно hwnd в текущих размерах и позиции

SW_SHOWMAXIMIZED

Активизирует окно hwnd в максимально распахнутом виде

SW_SHOWMINIMIZED

Активизирует окно hwnd в свернутом виде

SW_SHOWMINNOACTIVE

Сворачивает окно hwnd

SW_SHOWNA

Показывает состояние окна hwnd

SW_SHOWNOACTIVATE

Показывает окно hwnd в текущих координатах

SW_SHOWNORMAL

Активизирует и отображает окно hwnd в первоначальных размерах и позиции

Функция GetMessage имеет следующий прототип:

BOOL GetMessage( LPMSG lpmsg, HWND hwnd,

WORD uMsgFilterMin, WORD uMsgFilterMax);

Параметр lpmsg указывает на структуру типа MSG, в которую будет записано выбираемое сообщение, hwnd – дескриптор окна, для которого нужно выбрать сообщение. Если hwnd = NULL, то выбираются сообщения для всех окон приложения. Параметры uMsgFilterMin и uMsgFilterMax указывают диапазон выбираемых сообщений, задавая соответственно минимальное и максимальное значение кодов сообщений. Если для этих параметров указать нулевые значения, из очереди будут выбираться все сообщения.

Функция GetMessage выбранное сообщение удаляет из очереди и записывает его в структуру, адрес которой задан ее первым параметром. При выборке сообщения с кодом WM_QUIT она возвращает 0, и завершается цикл обработки сообщений. При выборке других сообщений функция GetMessage возвращает ненулевое значение.

После этого функция WinMain возвращает управление и значение поля wParam последнего сообщения операционной системе.