856 __ __ ______________Часть V. Инструментарий программиста
(создать окно) посылает сообщение WM_CREATE прямо оконной процедуре приложения и ждет, пока она обработает переданное. Здесь окна, которому сообщение могло бы быть послано, еще не существует, потому единственное возможное действие — послать сообщение непосредственно оконной процедуре.
Действие оконной функции подобно получению письма вашим другом. Вас не интересует, оставит почтальон письмо в ящике, или вручит его лично. Ваш друг получит письмо, прочтет его и немедленно ответит.
Приложения удаляют сообщения из своей очереди путем вызова функции GetMessage () в цикле внутри функции winMain (). Главный цикл обработки сообщений (main message loop), используя функцию GetMessage (), просматривает очередь сообщений приложения и возвращает первое сообщение из очереди (см. листинг 30.2). Если очередь сообщений пуста, функция GetMessage () передает управление Windows, позволяя другим приложениям обрабатывать свои сообщения.
int PASCAL WinMain(«INSTANCE hinstCurrent, HINSTANCE hinstPrevious,
LPSTR IpszCmdLine, int nCmdShow) {
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg) ;
DispatchMessage(&msg);
} return (int) msg.wParam;
)
Когда функция приложения GetMessage () извлекает сообщение из очереди сообщений, она пересылает его в оконную процедуру, вызывая функцию DispatchMessage (). Эта функция сообщает системе Windows, что та должна обратиться к оконной процедуре того окна, которое соответствует дескриптору в сообщении (hwnd). При этом обращении Windows передает сообщение в оконную процедуру в качестве аргумента. Оконная процедура обрабатывает сообщение и выполняет требуемые операции в соответствии с его содержанием. По завершении работы управление возвращается главному циклу обработки сообщений, который может после этого извлекать из очереди новое сообщение.
Это похоже на то, что мы делаем каждый день, разбирая корреспонденцию. Прежде всего, мы просматриваем пачку, отделяя счета и важные сообщения