Структура приложения Windows
BOOL GetMessage (LPMSG lpmsg , HWND hwnd, UINT uMsgFilterMin , UINT uMsgFilterMax);
LONG DispatchMessage(const MSG * lpmsg);
Простейший цикл обработки сообщений выглядит следующим образом:
MSG msg;
. . .
while (GetMessage(&msg , 0 , 0 , 0 ) ) { DispatchMessage(&msg); }
Функция GetMessage извлекает очередное сообщение из очереди сообщений вызвавшего ее потока. Параметр lpmsg - дальний указатель на структуру типа MSG. Параметр hwnd (идентификатор окна) определяет конкретное окно из числа окон, созданных потоком, которому послано сообщение. Сообщения, инициируемые устройствами ввода, такими как клавиатура или мышь, посылаются окну, владеющему фокусом ввода (активному окну). В каждый момент времени поток либо вообще не владеет фокусом ввода (пользователь работает с окном другого потока), либо фокус ввода принадлежит одному из его окон. Если в качестве второго параметра функции GetMessage указан NULL ( или 0 ) , то сообщения будут выбираться для всех окон, принадлежащих вызвавшему функцию потоку. Третий и четвертый параметры функции GetMessage задают диапазон номеров сообщений , извлекаемых из очереди. Если оба параметра содержат нуль , то извлекаются все сообщения , направленные потоку. Функция GetMessage возвращает значение FALSE в случае, если извлекается сообщение WM_QUIT, во всех остальных случаях возвращается значение TRUE. Выборка сообщения WM_QUIT приводит к выходу из цикла, после чего обычно поток завершается. Следует также отметить важную особенность функции GetMessage : если функция обнаруживает, что очередь сообщений потока пуста, то поток блокируется и ему не выделяется процессорное время до тех пор, пока новое сообщение не поступит в очередь. Если пусты очереди всех прикладных потоков, то обычно процессорное время распределяется между низкоприоритетными системными потоками, в частности, запускается хранитель экрана.
предыдущаяследующая