Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по Леонову, 5семестр.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
503.3 Кб
Скачать

28.Работа с диалогами. Обработка сообщений.

Блоки диалога бывают двух типов — модальные (modal) и немодальные (modeless). Разница между ними заключается в способе управления потока­ми сообщений. Модальные блоки диалога блокируют все остальные окна приложения так, что пользователь не может с ними ничего сделать, пока не закроет его. Другими словами, они отсекают поток сообщений, идущих от мыши и клавиатуры к его родительским окнам или окнам того же уровня (sibling), делая их недоступными. Если пользователь все же пытается взаи­модействовать с недоступным окном, то система предупреждает об этом звуковым сигналом. Блоки диалога этого типа обычно не препятствуют пе­реключению с одного приложения на другое. В редких случаях можно ис­пользовать системные модальные блоки диалога, которые позволяют поль­зователю работать внутри лишь одного блока диалога и не позволяют переключаться ни на какие другие приложения.

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

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

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

Класс CDialog - Основное назначение этого класса состоит в предоставлении интерфейса программирования для управления блоками диалога. Использование класса CDialog позво­ляет создавать объекты обоих типов блоков диалога -модальные и немодальные. Блок диалога подобен любо­му другому окну Windows, но в отличие от других типов окон, объект этого класса является комбинацией класса CDialog или производного от него и шаблона диалога.

Для создания блока диалога исполь-ся ф-ция:

virtual int CDialog::DoModal() —создает и активизирует модальный блок диалога Windows, осуществляет полное взаимо­действие с пользователем и удаляет блок диалога после завершения работы, возвращая целое значение типа IDOK или IDCANCEL, позволяющее определить конечный результат его работы. Если функция не смогла создать блок диалога, то она возвращает -1.

InitModalIndirect() – способ создания модального блока диалога.

Для создания объекта модального блока диалога ип-ся ф-ция Cdialog();

CreateIndirect() - способ создания немодального блока диалога опирающийся на шаблон, созданный в памяти.

void CDialog::EndDialog(int nResult) —она не закрывает блок диалога сама, а только устанавливает флажок, чтобы закрыть его, как только закончится обработка текущего сообщения.

virtual void CDialog: :OnCancel() —просто завершает работу с модальным блоком диалога, вызывая EndDialog, и возвраща­ет IDCANCEL.

Несмотря на то что блок диалога представляет собой стандартное окно Windows, для него имеются свои специфические сообщения. Одним из ос­новных является WM_INITDIALOG. Это сообщение посылается процедуре блока диалога во время вызова функций Create, Create Indirect или DoModal после того, как были созданы окна всех его элементов управления, но до того как они стали видимыми. В ответ на это сообщение процедура блока диалога инициализирует каждый элемент управления. Например, она может заполнить список элементами, с которыми потом будет работать пользова­тель. В ответ на сообщение WM_INITDIALOG Windows вызывает специаль­ный обработчик:

virtual BOOL CDialog::OnInitDlalog()