MAKEINTRESOURCE(DIALOGMIN).hWnd.(DLGPROC) DialogMin.17):
DlgMod - 0; break ;
case WMJ.BUTT0ND0WN:

SetTimer(hWnd.2.7000.NULL); //Через 7 секунд окно диалога исчезнет DlgWin = CreateDi alog(GetModuleHandle(NULL).

MAKE INTRESOURCE(DIALOGMIN).hWnd.(DLGPROC) DialogMin);
break;

//После каждой операции в модальном окне оконная процедура главного окна //получает сообщение WM_ENTERIDLE и таймер перезапускается

case WMJNTERIDLE:

KillTimer( hWnd. 1 ); Перезапуск

SetTi mer(hWnd.1.5000.NULL); таймера.

break;

//Через пять секунд после прихода последнего сообщения WM_ENTERIDLE

//в диалоговое окно DlgMod (если оно создавалось) будет послано сообщение

//WM CLOSE и диалог завершится. _ .

продолжение &

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

Листинг 7.5 {продолжение)

case WMJIMER:

KillTimer( hWnd. 1 ); //Завершение модального диалога i f(Dl gMod)PostMessage(DlgMod.WM_CL0SE.0.0);

KillTimerC hWnd. 2 ); //Завершение немодального диалога i f(DlgWin) PostMessage(DlgWin.WM_CL0SE.0.0): break;

}
return DefWindowProc(hWnd.message.wParam.lParam); }

Легко убедиться в том, что при щелчках по окну как модального, так и немодального диалога в диалоговую процедуру поступают сообщения мыши (WM_LBUTT0ND0WN, WM_RBUTTONDOWN). Но если модальное окно находится в фокусе ввода, то сообщения ему поступают из собственного цикла опроса очереди, а если фокус установлен на немодальное окно, то сообщения выбираются из очереди функцией основного цикла приложения GetMessage(). Функция DispatchMessage() основного цикла приложения пересылает сообщения в диалоговую процедуру, предварительно убедившись в том, что полученный в msg.hwnd дескриптор окна совпадает с DlgWin. Но если использовать основной цикл из предыдущих проектов, то нажатие клавиши Enter не приводит к закрытию диалога, так как не срабатывает назначение по умолчанию кнопки ОК.

Сообщения, необходимые для корректного обслуживания назначенной по умолчанию кнопки, будут посылаться в процедуру немодального диалога, если в основной цикл включить вызов функции IsDialogMessage(DlgWin, &msg), которая сама передает все сообщения, адресованные немодальному диалогу DlgWin и его элементам управления. Данная функция также определяет, что извлеченное из очереди сообщение WMCHAR порождено нажатием клавиши Enter. Если в этот момент фокус ввода принадлежит кнопке в диалоговом окне, то функция подменяет WM_CHAR сообщением WM_COMMAND, извещающим о щелчке по кнопке. Эту же функцию необходимо использовать, чтобы немодальный диалог корректно работал с другими клавишами.


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