Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Работа с немодальными диалоговыми окнами

Известно, что при создании модальных диалоговых окон сначала надо воспользоваться конструктором CDialog с параметром-идентификатором прикрепленного ресурса, чтобы сконструировать объект “диалоговое окно”, а потом вывести модальное диалоговое окно на экран, вызвав функцию-член DoModal. И как только происходит возврат из DoModal, окно прекращает свое существование.

Процесс создания немодальных диалоговых окон сложнее. Начинать необходимо с вызова конструктора CDialog по умолчанию, создавая, тем самым, объект “диалоговое окно”, а вот нужное диалоговое окно создается вызовом функции-члена CDialog::Create, а не функции DoModal. Create получает идентификатор ресурса как параметр и немедленно возвращает управление; при этом диалоговое окно остается на экране. Так что теперь именно программист должен заботиться о том, когда конструировать объект “диалоговое окно”, когда создавать само диалоговое окно, когда его уничтожать и когда обрабатывать данные, введенные пользователем.

Между созданием модальных и немодальных диалоговых окон есть следующие различия.

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

Немодальное диалоговое окно

Используемый конструктор

Конструктор с параметром-идентификатором ресурса.

Конструктор по умолчанию (без параметра)

Функция, используемая для создания окна

DoModal

Create с параметром-идентификатором ресурса.

 

Пользовательские сообщения

Допустим, Вы хотите, чтобы немодальное диалоговое окно уничтожалось, когда пользователь щелкает в этом окне кнопку ОК. Тут сразу же возникает проблема. Как объект “вид” узнает, что пользователь щелкнул кнопку ОК? Диалоговое окно могло бы напрямую обратиться к какой-либо функции-члену класса “вид”, но это бы связало данное диалоговое окно с конкретным классом “вид”. Более удачное решение — диалоговое окно при вызове обработчика кнопки ОК отправляет объекту “вид” пользовательское сообщение (user-defined message). Получив это сообщение, объект “вид” сможет уничтожить диалоговое окно (но не сам объект). Итак, вырисовывается сценарий создания нового диалогового окна

Есть два варианта отправки Windows-сообщений, через функции CWnd::SendMessage или PostMessage. Первая немедленно вызывает функцию-обработчик сообщения, а вторая отправляет сообщение в очередь сообщений Windows. Поскольку PostMessage вносит лишь небольшую задержку, можно считать, что функция-обработчик кнопки ОК уже завершилась, когда объект “вид” получает сообщение.

Принадлежность диалогового окна

Теперь предположим, что Вы приняли стиль диалогового окна по умолчанию, т.е. диалоговое окно не ограничено клиентской областью окна представления.

Поскольку речь идет о Windows, “владелец” диалогового окна — основное окно рамка приложения, а не объект “вид”. Но надо знать, какой именно объект “вид” сопоставлен с диалоговым окном, чтобы отправить этому объекту сообщение. Поэтому ваш класс “диалоговое окно” должен отслеживать свой объект “вид” через переменную член, которую устанавливает конструктор. Параметр pParent конструктора CDialog в данном случае не играет никакой роли.