Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

2.2.12 Отображение окна

К тому времени, когда функция CreateWindow возвращает управление программе, окно уже создано внутри Windows. Однако, на экране монитора оно еще не появилось. Необходимы еще два вызова. Первый из них:

ShowWindow(hwnd, iCmdShow);

Первым параметром является описатель только что созданного функцией CreateWindow окна. Вторым параметром является величина iCmdShow, передаваемая в качестве параметра функции WinMain. Он задает начальный вид окна на экране. Если iCmdShow имеет значение SW_SHOWNORMAL (т. е. 1), на экран выводится обычное окно. Если iCmdShow имеет значение SW_SHOWMINNOACTIVE (т. е. 7), то окно не выводится, а на панели задач появляются его имя и иконка.

Функция ShowWindow выводит окно на экран. Если второй параметр ShowWindow имеет значение SW_SHOWNORMAL, то фон рабочей области окна закрашивается той кистью, которая задана в классе окна. Вызов функции:

UpdateWindow(hwnd);

вызывает затем перерисовку рабочей области. Для этого в оконную процедуру (функция WndProc в HELLOWIN.CPP) посылается сообщение WM_PAINT. Вскоре мы изучим, как WndProc обрабатывает это сообщение.

2.2.13 Цикл обработки сообщений

После вызова функции UpdateWindow, окно окончательно выведено на экран. Теперь программа должна подготовить себя для получения информации от пользователя через клавиатуру и мышь. Windows поддерживает "очередь сообщений" (message queue) для каждой программы, работающей в данный момент в системе Windows.

Когда происходит ввод информации, Windows преобразует ее в "сообщение", которое помещается в очередь сообщений программы.

Программа извлекает сообщения из очереди сообщений, выполняя блок команд, известный как "цикл обработки сообщений" (message loop):

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

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

Переменная msg — это структура типа MSG, которая определяется в заголовочных файлах Windows следующим образом:

typedef struct tagMSG

{

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

Тип данных POINT — это тип данных другой структуры, которая определяется так:

typedef struct tagPOINT

{

LONG x;

LONG y;

} POINT;

Вызов функции GetMessage, с которого начинается цикл обработки сообщений, извлекает сообщение из очереди сообщений:

GetMessage(&msg, NULL, 0, 0)

Этот вызов передает Windows указатель на структуру msg типа MSG. Второй, третий и четвертый параметры, NULL или 0, показывают, что программа получает все сообщения от всех окон, созданных этой программой.

Windows заполняет поля структуры сообщений информацией об очередном сообщении из очереди сообщений.

Поля этой структуры следующие:

hwnd — описатель окна, для которого предназначено сообщение. В программе HELLOWIN, он тот же, что и hwnd, являющийся возвращаемым значением функции CreateWindow, поскольку у нашей программы имеется только одно окно.

message — идентификатор сообщения. Это число, которое идентифицирует сообщение. Для каждого сообщения имеется соответствующий ему идентификатор, который задается в заголовочных файлах Windows и начинается с префикса WM (оконное сообщение — window message). Например, если вы установите указатель мыши в рабочей области программы HELLOWIN и нажмете левую кнопку мыши, Windows поставит сообщение в очередь сообщений с полем message равным WM_LBUTTONDOWN, значение которого 0x0201.

wParam — 32-разрядный параметр сообщения (message parameter), смысл и значение которого зависят от особенностей сообщения.

lParam — другой 32-разрядный параметр, зависящий от сообщения.

time — время, когда сообщение было помещено в очередь сообщений.

pt — координаты курсора мыши в момент помещения сообщения в очередь сообщений.

Если поле message сообщения, извлеченного из очереди сообщений, равно любому значению, кроме WM_QUIT (т. е., 0x0012), то функция GetMessage возвращает ненулевое значение. Сообщение WM_QUIT заставляет программу прервать цикл обработки сообщений. На этом программа заканчивается, возвращая число wParam структуры msg.

Инструкция:

TranslateMessage(&msg);

передает структуру msg обратно в Windows для преобразования какого-либо сообщения с клавиатуры. (Более подробно об этом будет рассказано в главе 5.)

Инструкция:

DispatchMessage(&msg);

также передает структуру msg обратно в Windows. Windows отправляет сообщение для его обработки соответствующей оконной процедуре — таким образом, Windows вызывает оконную процедуру. Такой оконной процедурой в HELLOWIN является функция WndProc. После того, как WndProc обработает сообщение, оно возвращается в Windows, которая все еще обслуживает вызов функции DispatchMessage. Когда Windows возвращает управление в программу HELLOWIN к следующему за вызовом DispatchMessage коду, цикл обработки сообщений в очередной раз возобновляет работу, вызывая GetMessage.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]