Цикл обработки сообщений
Программа получает информацию от пользователя через клавиатуру и мышь. Для каждой программы, работающей в данный момент, Windows поддерживает «очередь сообщений» (message queue). Когда происходит ввод информации, она преобразуется в «сообщение», которое помещается в эту очередь.
Программа извлекает сообщения из очереди, выполняя блок соответствующих команд, известный как «цикл обработки сообщений» (message loop):
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
Переменная msg – структура типа MSG, определенная следующим образом:
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 (&msg, NULL, 0, 0);
извлекает сообщение из очереди и в Windows передается указатель на структуру msg; второй, третий и четвертый параметры (NULL или 0) показывают, что программа получает все сообщения от всех окон. Система Windows заполняет поля структуры сообщений информацией об очередном сообщении из очереди. Поля этой структуры следующие:
hwnd – описатель окна, для которого предназначено сообщение;
message – идентификатор сообщения, который задается в заголовочных файлах и начинается с префикса WM (оконное сообщение – window message);
wParam – 32-разрядный параметр сообщения, смысл и значение которого зависят от особенностей сообщения;
lParam – 32-разрядный параметр, зависящий от сообщения;
time – время, когда сообщение было помещено в очередь;
pt – координаты курсора в момент помещения сообщения в очередь.
Если поле message сообщения, извлеченного из очереди, равно любому значению, кроме WM_QUIT (0x0012), то функция GetMessage возвращает ненулевое значение; сообщение WM_QUIT прерывает цикл обработки сообщений – программа заканчивается, возвращая число wParam структуры msg.
Функция TranslateMessage (&msg); передает структуру msg обратно в Windows для преобразования сообщения.
Функция DispatchMessage (&msg); передает структуру msg для ее обработки соответствующей оконной процедурой (WndProc). После того как WndProc обработает сообщение, оно возвращается в Windows, которая все еще обслуживает вызов функции DispatchMessage. Когда Windows возвращает управление в программу к следующему за вызовом DispatchMessage коду, цикл обработки сообщений в очередной раз возобновляет работу, вызывая GetMessage.
Оконная процедура
Оконная процедура определяет, что выводится в рабочую область окна и как окну реагировать на пользовательский ввод.
Оконной процедуре(WndProc) можно назначить любое имя. В программе может содержаться несколько оконных процедур. Оконная процедура всегда связана с определенным классом окна, который регистрируется функцией RegisterClassEx. Функция CreateWindow создает окно на основе определенного класса окна. На основе одного и того же класса можно создавать несколько окон.
Оконная процедура определяется следующим образом:
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,
WPARAM wParam, LPARAM lParam);
ее параметры идентичны первым четырем полям структуры MSG.
Дата добавления: 2017-10-04; просмотров: 2401;