Модальный и немодальный диалог
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Окно диалога – это окно, которое прикладные программы используют для индицирования или запроса информации. Наиболее часто окна диалога используются для получения от пользователя дополнительной информации сверх той, которую может обеспечить меню.

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

Оконная процедура окна диалога – это функция многократного вызова, которую вызывает Windows, когда она имеет сообщение для окна диалога. Как правило, внутри процедуры диалога не реализуется слишком много функций. Исключение составляют лишь инициализация дочерних окон элементов управления при создании окна диалога, обработка сообщений от дочерних окон элементов управления и завершение работы с окном диалога (т.е. обрабатываются сообщения WM _ INITDIALOG, WM _ COMMAND , WM _ DESTROY). Оконная процедура окна диалога возвращает FALSE (0), если она не обрабатывает сообщение, или TRUE (ненулевое значение), если обрабатывает.

Рассмотрим отдельно модальные и немодальные окна диалога.

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

Модальное окно диалога – это окно, которое индицирует информацию и запрос на ввод от пользователя. Оно называется модальным, поскольку делает родительское окно временно недоступным и заставляет пользователя закончить запрашиваемые действия перед возвратом управления родительскому окну, т.е. нельзя переключаться между окном диалога и другими окнами программы. Но, несмотря на наличие на экране окна диалога, пользователь может переключиться на другие программы. Некоторые окна диалога (называемые системными модальными окнами – system modal) этого делать не позволяют. Системное модальное окно диалога вынуждает пользователя, перед тем как он получит возможность сделать что-либо другое в Windows, завершить работу с ним.

Модальное окно диалога запускает свой собственный цикл обработки сообщений из очереди прикладной программы без возврата в функцию WinMain.

Для создания модального окна диалога программа вызывает функцию DialogBox (могут также использоваться функции DialogBoxIndirect, DialogBoxParam, DialogBoxIndirectParam):

nResult = DialogBox (hInstance, lpTemplate, hWndParent, lpDialogFunc).

nResult – переменная, принимающая значение -1 при неуспешном завершении функции, в обратном случае возвращаемое значение – параметр nResult функции EndDialog, которая завершает работу модального окна диалога;

hInstance – дескриптор экземпляра;

lpTemplate – этот параметр идентифицирует шаблон окна диалога;

hWndParent – дескриптор родительского окна модального окна диалога;

lpDialogFunc – адрес процедуры диалога.

Работа модального окна диалога завершается с помощью функции EndDialog:

bret = EndDialog ( hDlg , nResult ).

nResult – определяет значение, которое будет возвращено приложению от функции DialogBox, создавшей диалоговое окно;

hDlg – дескриптор диалогового окна.

Логическая переменная bret принимает значение TRUE или FALSE соответственно при успешном или неуспешном завершении.

Windows не возвращает управление родительскому окну до тех пор, пока не вызвана функция EndDialog.

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

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

Немодальное окно диалога получает информацию через цикл обработки сообщений функции WinMain (см. п. 3.1).

Для создания немодального окна используется функция CreateDialog (могут также использоваться функции CreateDialog Indirect, CreateDialogParam, CreateDialog Indirect Param):

hDlgModeLess = CreateDialog (hInstance, lpTemplate, &

hWndParent, lpDialogFunc).

Параметры этой функции те же, что и параметры функции DialogBox. Отличие состоит в том, что дескриптор окна диалога возвращается сразу же после выполнения функции CreateDialog и, как правило, хранится в глобальной переменной.

Для закрытия немодального окна диалога используется функция DestroyWindow:

bret = DestroyWindow ( hDlg ).

hDlg – дескриптор диалогового окна (локальная переменная, используемая в оконной процедуре окна диалога).

Функция возвращает значение bret, равное TRUE или FALSE соответственно при успешном или неуспешном завершении. После вызова функции DestroyWindow глобальная переменная, содержащая дескриптор немодального окна диалога, должна быть установлена в ноль.

К немодальным окнам диалога относятся окна панели состояния и панели инструментов, используемые в КП Компоновщик. Эти два окна всегда находятся на экране.

 

Панель инструментов

 

Панель инструментов предназначена для реализации дополнительных функций, предоставляемых программой.

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

Вид панели инструментов представлен на рис. 3.2.

 

Рис. 3.2. Вид панели инструментов

 

В рассматриваемой программе на панель инструментов вынесены следующие наиболее часто употребимые функции:

à вставить копию текущей строки;

à вставить новую строку после текущей;

à удалить текущую строку;

à восстановить ранее удаленные строки;

à ввести шаблон поиска (эта функция реализована с помощью стандартного дочернего окна управления класса «окно редактирования»);

à поиск по шаблону вниз;

à поиск по шаблону вверх;

à сортировать в порядке возрастания;

à сортировать в порядке убывания;

à буфер обмена;

à калькулятор;

à печать;

à выбор титров;

à локальная помощь;

à помощь.

Кроме того, на панели инструментов имеются радиокнопки, предназначенные для реализации дополнительных функций подготовки и обработки данных: трансляции, протокола, редактирования названий узлов и др.

Каждый раз при открытии дочернего окна панель инструментов активизирует доступные ему функции.

Входные параметры панели инструментов.

В рассматриваемой программе панель инструментов создается путем вызова функции CreateDialog:

hPnUpr = CreateDialog (hInstance, LOC («PnUpr» C), hWnd, LOC(PnUpr)).

Параметры этой функции содержат следующую информацию:

hInstance – дескриптор экземпляра программы;

LOC(‘’PnUpr’’C) – идентифицирует шаблон блока диалога. Этот параметр является адресом символьной строки, в которой содержится имя шаблона диалогового окна;

hWnd – дескриптор родительского окна. Для панели инструментов родительским является главное окно программы;

LOC(PnUpr) – адрес процедуры диалога.

Функция возвращает дескриптор панели инструментов, который хранится в глобальной переменной hPnUpr.

Процедура диалогового окна панели инструментов определяется следующим образом:

integer function PnUpr (hDlg, message, wParam, lParam)

Параметры процедуры диалога аналогичны параметрам оконной процедуры главного окна: hDlg – дескриптор окна диалога; message – переменная, идентифицирующая сообщение; параметры wParam и lParam содержат дополнительную информацию о сообщении.

Процедура диалогового окна панели инструментов обрабатывает только два типа сообщений:

а) WM _ INITDIALOG; это сообщение посылается процедуре диалога при создании диалогового окна прежде, чем оно отображается на дисплее. При получении этого сообщения процедура диалога вычисляет высоту панели инструментов, используя для этого функцию GetWindowRect:

bret = GetWindowRect (hDlg, rect).

Функция заполняет поля структуры rect типа T _ RECT информацией о размерах рабочей области диалогового окна панели инструментов. Затем вычисляется высота диалогового окна:

YDlg = rect % bottom – rect % top.

Вычисленное значение хранится в глобальной переменной YDlg.

б) дочерние окна управления панели инструментов посылают процедуре диалогового окна сообщения WM _ COMMAND. Параметры этого сообщения содержат идентификатор дочернего окна (младшее слово параметра wParam), код уведомления (старшее слово wParam) и дескриптор дочернего окна управления, пославшего сообщение (lParam). В рассматриваемой программе дочерними окнами управления панели инструментов являются окно ввода шаблона поиска и радиокнопки. Процедура диалога при получении сообщения WM _ COMMAND определяет по младшему слову параметра wParam идентификатор дочернего окна, от которого пришло сообщение, и выполняет соответствующие действия.

Выходные параметры панели инструментов.

Выходными параметрами панели инструментов являются сообщения активному на данный момент дочернему окну или панели состояния.

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

Алгоритм, реализующий вышесказанное, выглядит следующим образом.

1. Нажата кнопка мыши?

Если нажата правая кнопка:

а) определить выбранный на панели инструментов орган управления;

б) вывести соответствующее выбранному органу управления текстовое пояснение в предназначенное для этого поле панели состояния.

Если дочернее окно активно и нажата левая кнопка:

а) определить выбранный на панели инструментов орган управления;

б) отправить активному дочернему окну сообщение, содержащее идентификатор выбранного органа управления.

2. Продолжить выполнение программы.

Приведенный алгоритм требует некоторых пояснений.

Каждый раз при щелчке правой или левой кнопкой мыши над рабочей областью панели инструментов оконной процедуре главного окна посылается сообщение WM _ PARENTNOTIFY, содержащее в своих параметрах следующую информацию:

à идентификатор панели инструментов;

à какая именно кнопка мыши нажата;

à координаты курсора в момент нажатия.

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

Когда дочернему окну посылается сообщение на поиск по шаблону, оно, в свою очередь, посылает сообщение IDOK панели инструментов для насильственного чтения шаблона.

По окончании работы подпрограмм возобновляется выполнение цикла обработки сообщений.

В рассматриваемой программе процедура диалога панели инструментов и указанные подпрограммы объединены в одном модуле, что позволяет рассматривать панель инструментов как «черный ящик» (объект). «Черный ящик» получает некоторые сообщения и определенным образом на них реагирует (рис. 3.3).

 

 


Рис. 3.3. Панель инструментов

 

Панель инструментов отображается на поверхности главного окна все время и уничтожается только по завершении работы.

 


Дата: 2019-05-29, просмотров: 180.