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


Программа получает информацию от пользователя через клавиатуру и мышь. Для каждой программы, работающей в данный момент, 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; просмотров: 2307;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.