Простейший цикл обработки сообщений состоит из вызовов двух функций – GetMessage и DispatchMessage.
BOOL WINAPI GetMessage(
LPMSG lpMsg,// Указатель на структуру MSG, которая получает информацию об очередном сообщении из очереди сообщений.
HWND hWnd,// дескриптор окна, чьи сообщения должны быть извлечены.
UINT wMsgFilterMin, //наименьший номер сообщения
UINT wMsgFilterMax//наибольший номер сообщения
);
Если wMsgFilterMin и wMsgFilterMax равны нулю, GetMessage возвращает все доступные сообщения (то есть, фильтрация сообщений не выполняется).
Функция GetMessage предназначена для выборки сообщения из очереди приложения. Сообщение выбирается из очереди и записывается в область данных, принадлежащую приложению. Функция возвращает ненулевое значение, если очередное сообщение не WM_QUIT, и ноль в случае WM_QUIT.
Функция DispatchMessage предназначена для распределения выбранного из очереди сообщения нужной функции окна. Так как приложение обычно создает много окон, и эти окна используют различные функции окна, необходимо распределить сообщение именно тому окну, для которого оно предназначено. Windows оказывает приложению существенную помощь в решении этой задачи – для распределения приложению достаточно вызвать функцию DispatchMessage.
|
|
Вот как выглядит простейший вариант цикла обработки сообщений:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
return (int) msg.wParam;
Завершение цикла обработки сообщений происходит при выборке из очереди сообщения WM_QUIT, в ответ на которое функция GetMessage возвращает нулевое значение.
Коды сообщений определены в файле WinUser.h, включаемом в исходные тексты любых приложений Windows.
Функции работы с сообщениями
Таблица 2
Функции для работы с сообщениями
Имя функции | Назначение | |
GetMessage | Извлекает сообщение из очереди сообщений приложения. | |
DispatchMessage | Передает сообщение функции окна. | |
PostMessage | Посылает сообщение в очередь. | |
SendMessage | Посылает сообщение в функцию окна, возврат из функции происходит после обработки этого сообщения. | |
PostQuitMessage | Посылает сообщение о завершении (WM_QUIT) в очередь сообщений приложения. | |
TranslateMessage | Переводит сообщения виртуальных клавиш в символьные. |
Классификация сообщений по функциональным признакам
Таблица 3
Системные сообщения
WM_SYSCOMAND | Выбран пункт меню System | |
WM_SYSKEYDOWN | Нажата системная клавиша | |
и др. |
Таблица 4