Модальные диалоговые окна


Модальное диалоговое окно должно быть всплывающим окном, имеющим системное меню, область заголовка и толстую рамку; то есть шаблон диалогового окна должен задать стили WS_POPUP, WS_SYSMENU, WS_CAPTION и DS_MODALFRAME. Хотя приложение может определять стиль WS_VISIBLE, система всегда показывает на экране модальное диалоговое окно независимо от того, задается или нет стиль диалогового окна WS_VISIBLE. Приложение не должно создавать модальное диалоговое окно, имеющее стиль WS_CHILD. Модальное диалоговое окно с этим стилем блокирует себя, препятствуя любому последующему вводу данных из действующего приложения.

Приложение создает модальное диалоговое окно, используя либо функцию DialogBox, либо DialogBoxIndirect. DialogBox требует имени или идентификатора ресурса, содержащего шаблон диалогового окна; DialogBoxIndirect требует дескриптора объекта памяти, содержащего шаблон диалогового окна. Функции DialogBoxParam и DialogBoxIndirectParam также создают модальные диалоговые окна; они идентичны выше упомянутым функциям, но, когда диалоговое окно создается, то передают заданный параметр в процедуру диалогового окна.

При создании модального диалогового окна, система делает его активным окном. Диалоговое окно остается активным до тех пор, пока процедура диалогового окна не вызовет функцию EndDialog, или система не активизирует окно в другом приложении. Ни пользователь, ни приложение не могут сделать окно владельца активным, пока модальное диалоговое окно не разрушится.

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

Поскольку система создает модальное диалоговое окно, то  она отправляет сообщение WM_CANCELMODE окну (если оно есть) в текущий момент захватившему ввод данных от мыши. Приложение, которое получает это сообщение, должно отказаться от монопольного использования мыши так, чтобы пользователь мог переместить мышь в модальное диалоговое окно. Поскольку система отключает окно владельца, весь ввод данных от мыши потеряется, если владелец после получения этого сообщения освобождение мыши завершает ошибкой.

Чтобы обрабатывать сообщения для модального диалогового окна, система запускает свой собственный цикл обработки сообщений, забирая временно управление очередью сообщений всего приложения. Когда система извлекает сообщение, которое  явно не для диалогового окна, она доставляет сообщение в соответствующее окно. Если она извлекает сообщение WM_QUIT, то помещает это сообщение в конец очереди сообщений прикладной программы так, чтобы главный цикл обработки сообщений приложения мог, в конечном счете, извлечь это сообщение.

Система отправляет сообщение WM_ENTERIDLE окну владельцу всякий раз, когда очередь сообщений приложения пуста. Прикладная программа может использовать это сообщение, чтобы выполнять фоновую задачу, в то время, когда диалоговое окно остается на экране. Когда приложение использует сообщение этим способом, оно должно часто осуществлять контроль (например, используя функцию PeekMessage) так, чтобы модальное диалоговое окно могло получить любой ввод данных пользователем. Чтобы воспрепятствовать отправке сообщений WM_ENTERIDLE модальным диалоговым окном, приложение может установить при создании диалогового окна стиль DS_NOIDLEMSG .

Приложение разрушает модальное диалоговое окно, используя функцию EndDialog. В большинстве случаев, процедура диалогового окна вызывает EndDialog, когда пользователь щелкает по кнопке Закрыть (Close) в системном меню диалогового окна или нажимает кнопку OK или Отменить (Cancel) в в диалоговом окне. Диалоговое окно может возвратить значение через посредство функции DialogBox (или другие создающие функции), определяя эту величину при вызове функции EndDialog. Система возвращает это значение после разрушения диалогового окна. Большинство прикладных программ используют это возвращаемое значение, чтобы выяснить, завершило ли диалоговое окно свои задачи успешно или было отменено пользователем. Система не возвращает управление из функции, которая создает диалоговое окно до тех пор, пока процедура диалогового окна не вызовет функцию EndDialog.

 

Назад в оглавление
На главную страницу

Hosted by uCoz