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

Win32 API. Диалоговые окна
Страница 4. Модальные диалоговые окна

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

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

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

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

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

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

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

Примечание: здесь и далее ОС – оперативная система.

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

Читайте также:  Broadcom ush drivers windows 10

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

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

Раздел 3. Окна диалога Windows, реестр Windows

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

Окно диалога это специальный вид окна, предназначенный обычно для взаимодействия пользователя с элементами управления, расположенными внутри диалогов. Окна диалогов бывают модальными (modal) и немодальными (modeless). (modal). Модальные диалоговые окна не дают пользователю возможность перенести фокус ввода на другое окно в том же программном потоке. То есть при открытом модальном диалоге сообщения не поступают в цикл обработки сообщений главного окна. В случае немодального диалога, сообщения поступают в цикл обработки сообщений главного окна приложения и должны быть перенаправлены в окно диалога.

Диалоговые окна обычно строятся на основе специального типа ресурсов – шаблона окна диалога, который создается с помощью визуальных средств пакета Visual Studio. Для создания модального диалогового окна нужно вызвать функцию API — Dialog Box и передать ей в качестве параметров: ресурс диалога, на основе которого будет строиться диалоговое окно; ссылку на окно родителя или NULL, если окно не имеет родителя и является главным окном приложения; адрес оконной процедуры диалога. Оконная процедура диалога обрабатывает сообщения, поступающие в окно диалога. Эта функция возвращает управление только после закрытия окна диалога. Обработка сообщений диалоговыми окнами имеет свои особенности, сообщение WM_PAINT и WM_DESTROY – диалогом не обрабатываются. Вместо сообщения WM_CREATE для инициализации диалога, посылается специальное сообщение WM_INITDIALOG. Как правило, диалоговое окно обрабатывает только сообщение WM_COMMAND, которое посылается большинством элементов управления, расположенных в диалоге. Взаимодействие с элементами управления осуществляется с помощью сообщений, которые могут быть посланы с помощью функции SendMessage с нужным набором параметров. Первым параметром функции SendMessage обычно служит указатель на элемент управления, полученный с помощью вызова функции GetDlgItem.

В отличие от модальных диалоговых окон, немодальные создаются с помощью функции CreateDialog. Закрыть немодальное диалоговое окно можно с помощью функции DestroyWindow, желательно при этом обнулить также дескриптор окна диалога. При создании ресурса немодального окна диалога нужно указывать стиль шаблона диалога WS_VISEBLE, иначе диалоговое окно не будет видимым, и нужно будет вызывать функцию ShowWindow, чтобы его показать.

Читайте также:  Windows 10 нет звука после обновления драйверов

Диалоговые окна общего пользования

Для стандартизации диалогов открытия и сохранения файлов, поиска и замены текста, печати, выбора цветов и шрифтов могут использовать специальные функции Windows, расположенные в динамической библиотеке — COMDLG32.dLL: GetOpenFileName, GetSaveFileName, FindText, ReplaceText, PrintDlg, ChooseColor, ChooseFont. Для использования этих функций в первую очередь необходимо проинициализировать поля соответствующей структуры и передать функции указатели на эту структуру. Функции создают и отображают окно диалога. Когда пользователь закрывает окно диалога, то в соответствующем поле структуры будет содержаться его выбор.

Работа с реестром Windows

Реестр Windows представляет собой иерархическую базу данных, в верху которой расположены пять главных ключей: HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS. В каждом главном ключе в свою очередь могут находиться ключи. Ключи могут содержать другие ключи и данные. Данные имеют имя и значение. Посмотреть содержимое реестра можно, набрав в командной строке Windows regedit.

Ключи HKEY_LOCAL_MACHINE и HKEY_CURRENT_USER содержат приблизительно одинаковое содержание, отличие заключается в том, что данные записанные в иерархию HKEY_LOCAL_MACHINE справедливы для всех пользователей. Данные собранные в иерархию HKEY_CURRENT_USER будут находиться в этом ключе реестра только во время работы данного пользователя.

Чтобы записать или считать данные в ключ реестра этот ключ должен быть сначала открыт вызовом функции RegCreateKeyEx или RegOpenKeyEx. Записать данные в реестр можно функцией RegSetValueEx, а считать функцией RegQueryValueEx. После окончания работы с ключом, его надо закрыть функцией RegCloseKey.

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

Цель: изучение взаимодействия с окнами диалога Windows, получение навыков работы с реестром.

Варианты задания 3

№ варианта Задание
1 Сектор задается в раскрывающемся списке, интенсивность синего цвета меняется с помощью ползунка, проценты задаются в поле редактирования, шрифт выбирается и отображается, диалог модальный
2 Выбора цвета с отображением на картинке, размер столбиков отображается в поле редактирования и меняется с помощью счетчика, диалог немодальный.
3 Размер шрифта выбирается в списке, цвет выбирается и отображается, сектор выбирается в раскрывающемся списке, диалог модальный.
4 Шрифт выбирается и отображается, размеры столбиков меняются в поле редактирования или с помощью счетчика, столбик выбирается в раскрывающемся списке, диалог немодальный.
5 Масштаб меняется с помощью кнопок выбора, шрифт выбирается и отображается, размер столбиков задается ползунком, диалог модальный.
6 Растр выбирается из файла и отображается, масштаб задается в раскрывающемся списке, диалог немодальный
7 Размер столбиков задается с помощью счетчика и отображается в поле редактирования, цвет выбирается и отображается, интенсивность цвета меняется ползунком, диалог модальный.
8 Цвет выбирается и отображается как на рисунке, так и значениями в системе RGB, размер столбиков задается с помощью счетчика и отображается в поле редактирования, диалог модальный.
9 Толщина границы задается в поле редактирования, цвет выбирается и отображается, отношение сторон треугольника задается кнопками выбора, диалог немодальный.
10 Цвет выбирается, и интенсивность его изменяется ползунком, размер столбиков задается с помощью счетчика и отображается в поле редактирования, диалог модальный.
11 X меняется ползунком и отображается, цвет задается и отображается, и его интенсивность меняется с помощью счетчика, диалог немодальный.
12 Цвет выбирается и отображается, столбик выбирается в раскрывающемся списке, длина столбика меняется с помощью счетчика, диалог немодальный.
13 Растр выбирается из файла и отображается, шрифт выбирается и его размер и величина отображается, величина шрифта может меняться с помощью счетчика, диалог модальный.
14 Шрифт выбирается и отображается, цвет заливки выбирается и отображается, интенсивность цвета меняется ползунком, диалог немодальный.
15 Цвет контура выбирается и отображается, величина столбиков отображается и меняется с помощью ползунка, толщина границ меняется с помощью счетчика, диалог модальный.
16 Номер столбика выбирается из раскрывающегося списка, а его размер меняется с помощью ползунка, шрифт выбирается и отображается, диалог немодальный.
17 Цвет выбирается и отображается, интенсивность заливки меняется с помощью счетчика, размер первого столбика отображается и меняется ползунком, диалог модальный.
18 Цвет сектора выбирается из раскрывающегося списка, цвет его границы с помощью стандартного диалога, X задается с помощью кнопок выбора, диалог немодальный.
19 X меняется счетчиком, шрифт выбирается, толщина границ выбирается кнопками выбора, диалог модальный.
20 X меняется ползунком в пределах: 0-100%, название шрифта выбирается из раскрывающегося списка, размер шрифта задается кнопками выбора, цвет выбирается и отображается, диалог модальный.
21 Цвет выбирается и отображается, X меняется ползунком, толщина границ выбирается с помощью счетчика, диалог модальный.
22 Цвет выбирается и отображается, значения его составляющих корректируются, X задается ползунком, диалог немодальный.
23 Растр выбирается и отображается, толщина границ задается с помощью раскрывающегося списка, цвет границы выбирается с помощью кнопок выбора, диалог модальный.
24 Цвет выбирается из раскрывающегося списка, шрифт выбирается и отображается, его размер меняется в поле редактирования, диалог модальный.
25 X выбирается кнопками выбора, цвет выбирается и отображается, шрифт выбирается и его величина меняется с помощью счетчика, диалог немодальный.

Указания. При использовании раскрывающегося списка, данные заносятся в него вызовами функции SendMessage. Чтобы установить число строк раскрывающегося списка в редакторе ресурсов необходимо щелкнуть мышью на треугольнике раскрытия списка, а затем растянуть список вниз.

Для использования в программе ползунка и счетчика, нужно включить заголовочный файл commctrl.h и подключить библиотеку comctl32.lib, для использования стандартных диалогов – commdlg.h.

При создании немодального окна диалога нужно указывать стиль шаблона диалога WS_VISIBLE, иначе диалоговое окно не будет видимым и нужно будет вызывать функцию ShowWindow, чтобы его показать.

Сохранять данные в реестре нужно в иерархии HKEY_CURRENT_USER, так как иерархия HKEY_LOCAL_MACHINE в компьютерах учебных классов обычно закрыта для изменения.

Читайте также:  Как архивировать файлы для отправки по почте windows
Оцените статью