Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
17
Добавлен:
14.02.2015
Размер:
641.54 Кб
Скачать

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

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

ShowWindow (hwnd, iCmdShow);

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

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

UpdateWindow (hwnd);

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

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

После вызова функции 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 для преобразования какого-либо сообщения с клавиатуры.

Инструкция:

DispatchMessage (&msg);

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