Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI-ekz_shpory.docx
Скачиваний:
11
Добавлен:
25.09.2019
Размер:
185.19 Кб
Скачать
  1. Диалоговые панели, модальные панели.

Диалоговые панели – это предопределенный в Windows класс окон (dialog window class), на базе этого класса создаются временные (pop-up) окна (иногда перекрывающиеся (overlapped) окна), на их поверхности располагаются дочерние окна - органы управления. Диалоговые панели значительно упрощают использование органов управления, так как функция окна, соответствующая классу диалоговых панелей и расположенная внутри Windows, обеспечивает как взаимодействие органов управления между собой, так и их взаимодействие с приложением. В частности, эта функция обеспечивает передачу фокуса ввода от одного органа управления к другому при помощи клавиши <Tab> и клавиш перемещения курсора <Up> и <Down>, выполняет обработку сообщений от клавиш <Enter> и <Esc>.

Для создания диалоговой панели вы должны предпринять следующие действия:

- создать шаблон диалога;

- определить функцию диалога;

- вызвать одну из функций создания диалога.

Диалоговые панели бывают трех типов: модальные, системные модальные и немодальные.

Модальная: главное окно приложения и его дочерние окна блокируются, перестают получать сообщения от мыши и клавиатуры. Но есть возможность работать с другими приложениями. Чтобы и это запретить – системные модальные диалоговые панели.

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

Создание модальных диалоговых панелей:

1. Шаблон диалога должен содержать стиль - DS_MODALFRAME для модальной диалоговой панели, DS_SYSMODAL – системной модальной диалоговой панели

2. Должна быть вызвана одна из следующих функций:

а) int WINAPI DialogBox (HINSTANCE hInstance, LPCSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc);

hInstance – идентификатор текущей копии приложениия,

lpszTemplate – указатель на строку имени шаблона, указанном в операторе DIALOG,

hwndOwner – идентификатор окна, создавшего диалоговую панель, dlgprc – адрес функции диалога.

б) DialogBoxParam имеет дополнительный пятый параметр LPARAM lParamInit - значение этого параметра передается через параметр lParam сообщения WM_INITDIALOG и может быть проанализировано на этапе создания диалоговой панели.

в) DialogBoxIndirect – для шаблона, сформированного в области памяти, аналогична функции DialogBox, но второй параметр – HGLOBAL hglbDlgTemplate – идентификатор глобального блока памяти, где подготовлен шаблон.

г) DialogBoxIndirectParam - аналогично функции DialogBoxIndirect + 5 параметр, как у DialogBoxParam

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

3. Для завершения работы используется – функция EndDialog(hwndDlg, nResult).

hwndDlg – идентификатор диалоговой панели, nResult – возвращает код завершения

  1. Немодальные панели. Отличие циклов сообщений.

Диалоговые панели бывают трех типов: модальные, системные модальные и немодальные.

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

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

Создание немодальных диалоговых панелей:

Должна быть использована одна из следующих функций:

а) int WINAPI CreateDialog(HINSTANCE hInstance,LPCSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc);

hInstance – идентификатор текущей копии приложениия,

lpszTemplate – указатель на строку имени шаблона, указанном в операторе DIALOG,

hwndOwner – идентификатор окна, создавшего диалоговую панель, dlgprc – адрес функции диалога.

б) CreateDialogParam имеет дополнительный пятый параметр LPARAM lParamInit - значение этого параметра передается через параметр lParam сообщения WM_INITDIALOG и может быть проанализировано на этапе создания диалоговой панели.

в) CreateDialogIndirect – для шаблона, сформированного в области памяти, аналогична функции CreateDialog, но второй параметр – HGLOBAL hglbDlgTemplate – идентификатор глобального блока памяти, где подготовлен шаблон.

г) CreateDialogIndirectParam - аналогична DialogBoxIndirect + 5 параметр, как у CreateDialogParam

Функции CreateDialog, CreateDialogParam, CreateDialogIndirect, и CreateDialogIndirectParam возвращают значение, передаваемое при завершении работы диалоговой панели с помощью функции EndDialog.

Для отображения немодальной диалоговой панели сразу после создания стиль панели, описанный в шаблоне, должен включать в себя константу WS_VISIBLE. Для завершения работы - функция DestroyWindow, в качестве параметра идентификатор окна панели. Стиль DS_MODALFRAME указывать не надо.

Отличие циклов сообщений.

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

Для разделения этих сообщений цикл обработки должен вызывать функцию IsDialogMessage, в данном случае цикл будет выглядеть следующим образом

hwndDlg = (HWND)0;

while(GetMessage(&msg, 0, 0, 0))

{

if(hwndDlg == 0 || !IsDialogMessage(hwndDlg, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg); }}

Функция IsDialogMessage определяет, предназначено ли сообщение, определяемое параметром lpmsg, для немодальной диалоговой панели с идентификатором окна, равным hwndDlg. Если да, то функция сама выполняет обработку такого сообщения и возвращает значение TRUE. В противном случае возвращается значение FALSE.

Когда немодальная диалоговая панель будет создана, идентификатор ее окна будет записан в переменную hwndDlg. После этого в работу включится функция IsDialogMessage. Она будет "вылавливать" в очереди приложения сообщения, предназначенные для диалоговой панели hwndDlg и выполнять их обработку. Все остальные сообщения будут обработаны обычным образом функциями TranslateMessage и DispatchMessage.

Условие будет выполняться, когда сообщения предназначены для главного окна.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]