Листинг 7.7

while (GetMessage(&msg. NULL. 0. 0)) {
extern HWND ButtonWnd;
if (msg.hwnd-ButtonWnd && LOWORD(msg.wParam)-Oxd &&
msg. message-WM_KEYDOWN)
{msg.message - WM_LBUTT0ND0WN; msg.wParam - MK_LBUTTON; msg.lParam - 0x00050005; }
if (msg.hwnd-ButtonWnd && L0W0RD( msg.wParam)- Oxd &&
msg. message-WM_KEYUP)
{msg.message - WM_LBUTTONUP; msg.wParam - MK_LBUTTON; msg.lParam - 0x00050005; }
DispatchMessage((LPMSG) &msg);
}

Показанный выше цикл опроса очереди работает так же корректно, как и при использовании функции IsDialogMessageO, но функция IsDialogMessageO обслуживает различные клавиши и все элементы управления, размещенные в диалоговом окне, посылая и обрабатывая сообщения WM_GETDLGCODE.

Теперь следует провести анализ работы проекта.

Прежде всего следует активировать модальный диалог и при помощи щелчка правой кнопкой по рабочей области его окна отобразить сообщение о типе диалога, как показано на рис. 7.2 слева. Такой же щелчок по немодальному окну выведет сообщение не из диалогового окна, а из основного цикла приложения, показанное на рис. 7.2 справа. Это подтверждает, что немодальный диалог получает

Диалоговые окна

сообщения из основного цикла приложения, а в модальном диалоге организован отдельный цикл опроса очереди.

Если в ситуации, показанной на рис. 7.2 справа, не нажимать кнопку ОК в окне MessaggeBox, то по истечении семи секунд диалоговое окно исчезнет. Оно будет закрыто по таймеру, а в основном цикле будет находиться извлеченное из очереди, но не обработанное сообщение, предназначенное уже закрытому окну диалога.

После исчезновения окна немодального диалога, вызванного истечением времени, нужно закрыть окно с надписью Щелчок в окне диалога. Управление перейдет к функции Di spatchMessage(), которая находит пусковую точку диалоговой процедуры, передает ей сообщение WM_RBUTT0ND0WN, и та при закрытом окне диалога выводит сообщение Немодальный. Если после закрытия немодального диалога функцией EndDialog() посылать ему, например, по таймеру сообщение, приведенное ниже, то его оконная функция будет каждый раз выводить сообщение о типе диалога:


⇐ Предыдущая| |Следующая ⇒