Используя показанную выше диалоговую процедуру, следует создавать по щелчку левой кнопкой немодальный диалог, а по щелчку правой кнопкой - модальный диалог. Модальный диалог блокирует поступление в основное окно приНемодальный диалог ложения сообщений от внешних устройств, но основная функция главного окна продолжает просматривать очередь сообщений. Поэтому в основном окне можно организовать взаимодействие с модальным диалогом. Это позволит, например, закрывать диалоговое окно, если пользователь какое-то время не работает с ним. Для этого перед созданием модального диалога при помощи функции SetTimer( ) запускается таймер. Через заданный интервал времени в диалоговое окно посылается сообщение, вызывающее завершение диалога. В нашем примере можно послать сообщение WM_CL0SE или WM_COMMAND с идентификатором ID0K.

В таком решении есть один недостаток. Заданный интервал лучше отсчитывать не от момента создания диалога, а от последнего действия пользователя с элементами окна. Решить эту задачу можно при помощи перезапуска таймера по сообщению WM_ENTERIDLE, которое модальный диалог посылает породившему его окну при каждом выходе из диалоговой процедуры. Назначение этого сообщения уже рассматривалось ранее при обсуждении работы с меню.

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

Код модуля с оконной функцией главного окна, реализующей предложенное решение (файл WndProc.cpp), приведен в листинге 7.5.

Листинг 7.5

#include <windows.h> #include "resource.h" extern HWND DlgMod; extern HWND DlgWin;

BOOL Dialog (HWND hDlg.UINT.WPARAM.LPARAM); //Прототип диалоговой процедуры: LRESULT АР I ENTRY InputWndProc (HWND hWnd. UINT message. WPARAM wParam.

LPARAM lParam)
{
switch (message) {
case WM_DESTROY: PostQuitMessage(O); break;

//По щелчку правой кнопкой мыши запускается таймер и создается

//модальный диалог

case WM_RBUTT0ND0WN: //Создание модального диалога SetTi mer(hWnd.1.5000.NULL): DialogBoxParam(GetModuleHandle(NULL).


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