Окт 16

Различия между модальными и немодальными окнами диалога

Мы уже знаем, что модальные диалоговые окна создаются при помощи функции DialogBox. Эта функция возвращает управление только после закрытия диалогового окна. Немодальные диалоговые окна создаются с помощью функции Create Dialog. Она принимает такие же параметры, что и функция DialogBox:
hDlgModeless = CreateDlalogChlnst. MAKEINTRESOURCE(IDD_DLG). hWnd. DlgProc); то есть функции передаются дескриптор экземпляра приложения, идентификатор шаблона диалога, дескриптор родительского окна и адрес диалоговой процедуры.
Различие состоит в том, что функция CreateDialog сразу возвращает дескриптор диалогового окна. Как правило, этот дескриптор хранится в глобальной переменной.
Определяя свойства шаблона диалогового окна, обязательно установите флажок Visible на вкладке More Styles окна Dialog Properties. Если этот флажок сброшен, то для появления окна на экране потребуется после вызова функции CreateDialog дополнительно вызвать функцию ShowWindow:
ShowWindow(hDlgModeless. SW_SH0W):
При сброшенном флажке Visible и отсутствии указанного вызова функции ShowWindow немодальный диалог вообще не появится на экране. Модальное диалоговое окно менее притязательно: оно появляется на экране и при сброшенном флажке Visible.
Функция IsDialogMessage определяет, относится ли сообщение, сохраненное в переменной msg, к диалоговому окну hModelessDLg. Если да, то функция обрабатывает это сообщение, отправляя его диалоговой процедуре и возвращая значение TRUE. В ином случае функция ничего не делает с сообщением и возвращает значение FALSE.
Сообщения, переданные на обработку диалоговой процедуре, не должны обрабатываться функциями TranslateMessage и DispatchMessage. Это обеспечивает условный оператор if, анализирующий код возврата функции IsDialogMessage. Заметим, что если немодальное диалоговое окно еще не создано, то дескриптор hModelessDlg должен быть равен нулю и в этом случае функция IsDialogMessage тоже возвращает значение FALSE.
Для закрытия немодального диалогового окна вместо функции End Dialog вызывается функция Destroy Window. Если диалог закрывается, а приложение продолжает работать, то рекомендуется дескриптор hModelessDlg установить в нулевое значение.