Создание диалоговой панели


Диалоговая панель обычно представляет собой временное (pop - up) окно, хотя допустимо использовать и перекрывающиеся (overlapped) окна. Для создания диалоговой панели вам не требуется вызывать функцию CreateWindow, так как в программном интерфейсе Windows определены функции, специально предназначенные для создания диалоговых панелей.

Разумеется, перед вызовом этих функций необходимо создать шаблон диалоговой панели. Это можно сделать, использовав один из описанных выше способов.

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

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

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

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

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

Создание шаблона диалога

Для создания шаблона диалога лучше всего воспользоваться редактором диалога Borland Resource Workshop или Microsoft Dialog Editor. Опишем процесс создания диалога с помощью редактора диалога, входящего в состав приложения Resource Workshop.

Использование текстового редактора

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

Описание шаблона

Описание шаблона имеет следующий вид:

nameID DIALOG [load] [mem] x, y, width, height

CAPTION "Заголовок диалоговой панели"

STYLE Стиль

BEGIN . . .

. . .

. . .

END

В этом описании nameID используется для идентификации шаблона диалоговой панели и может указываться либо в виде текстовой строки, либо в виде числа от 1 до 65535.

Параметр load - необязательный. Он используется для определения момента загрузки диалоговой панели в память. Если этот параметр указан как PRELOAD, диалоговая панель загружается в память сразу после запуска приложения. По умолчанию используется значение LOADONCALL, при использовании которого загрузка шаблона в память происходит только при отображении диалоговой панели.

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

Параметры x и y определяют, соответственно, x - координату левой границы диалоговой панели и y - координату верхней стороны диалоговой панели. Координаты могут принимать значения от 0 до 65535.

Параметры width и height определяют, соответственно, ширину и высоту диалоговой панели. Эти параметры могут находиться в диапазоне от 1 до 65535.

Для описания шаблонов диалоговых панелей используется специальная координатная система, в которой размер единицы длины в пикселях зависит от размера системного шрифта. Такая координатная система позволяет создавать диалоговые панели, размер которых не зависит от режима работы видеоадаптера. Это возможно благодаря тому, что размер системного шрифта в пикселях зависит от разрешения - в режиме 800х600 точек размеры системного шрифта больше, чем, например, в режиме 640х480 точек.

Одна единица длины в координатной системе, используемой при описании ширины элементов шаблонов диалоговых панелей, составляет четверть средней ширины символов системного шрифта, а при описании высоты (или вертикальных размеров) - восьмую часть высоты символов системного шрифта. Так как высота символов системного шрифта примерно в два раза больше средней ширины этих символов, единица длины в этой системе координат имеет одинаковый размер по вертикали и горизонтали. Эта единица называется диалоговая единица (dialog unit).

Размер единицы измерения dialog unit можно получить при помощи функции GetDialogBaseUnits:

DWORD WINAPI GetDialogBaseUnits(void);

Младшее слово возвращаемого значения представляет собой ширину в пикселях диалоговой единицы длины, старшее - высоту.

Оператор CAPTION предназначен для определения заголовка диалоговой панели.

Оператор STYLE используется для назначения стиля окну диалоговой панели. В качестве стиля вы можете использовать комбинацию символических имен, определенных в файле windows.h и имеющих префикс WS_. Специально для диалоговых панелей в этом файле определены несколько констант с префиксом DS_.

Имя константы Описание
DS_LOCALEDIT При использовании этого стиля редакторы текста, созданные в диалоговой панели, будут использовать память в сегменте данных приложения. В этом случае можно использовать сообщения EM_GETHANDLE и EM_SETHANDLE
DS_MODALFRAME Создается модальная диалоговая панель (см. ниже)
DS_NOIDLEMSG Если этот стиль не указан, когда диалоговая панель переходит в видимое состояние (отображается), Windows посылает родительскому окну (создавшему диалоговую панель), сообщение WM_ENTERIDLE
DS_SYSMODAL Создается системная модальная диалоговая панель

Для создания стандартной диалоговой панели используются стили WS_POPUP, WS_BORDER, WS_SYSMENU, WS_CAPTION, DS_MODALFRAME. Если нужно создать диалоговую панель с рамкой, но без заголовка, используется стиль WS_DLGFRAME.

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

При выводе на экран модальной диалоговой панели работа приложения приостанавливается. Функции главного окна приложения и всех дочерних окон перестают получать сообщения от мыши и клавиатуры. Все эти сообщения попадают в временное (pop - up) окно диалоговой панели. Когда работа пользователя с диалоговой панелью будет завершена, главное окно приложения и его дочерние окна будут разблокированы. Заметьте, что диалоговая панель не должна создаваться как дочернее окно - в этом случае при активизации диалоговой панели она будет заблокирована наряду с остальными дочерними окнами и приложение "зависнет".

Модальная диалоговая панель, тем не менее, позволяет пользователю переключиться на работу с другими приложениями. Если вам требуется запретить такое переключение, используйте системные модальные диалоговые панели. Типичным примером такой панели является панель "Exit Windows", появляющаяся на экране перед завершением работы Windows. Пока эта панель находится на экране, вы не можете переключиться на работу с другими приложениями.

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

Помимо операторов STYLE и CAPTION, описание шаблона может содержать операторы CLASS и FONT.

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

CLASS "PrivateDlgClass"

В этом томе мы не будем рассматривать создание диалоговых панелей на базе собственных классов.

Перед созданием диалоговой панели с собственным классом этот класс должен быть зарегистрирован. При этом в структуре WNDCLASS, используемой для регистрации, поле cbWndExtra должно иметь значение DLGWINDOWEXTRA.

Оператор FONT позволяет задать шрифт, с использованием которого Windows будет писать текст в диалоговой панели:

FONT 10, "MS Serif"

Первый параметр оператора FONT указывает размер шрифта в пунктах, второй - название шрифта, определенного в файле win.ini. Отметим, что единственный шрифт, присутствие которого гарантируется - это системный шрифт. Все остальные шрифты можно отключить при помощи приложения Control Panel.

Описание всех органов управления, расположенных на поверхности диалоговой панели, должно находиться между строками BEGIN и END.

Для описания органов управления используются три формата строк.

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

CtlType "Текст", ID, x, y, width, height [,style]

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

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

Параметр ID - идентификатор органа управления. Этот идентификатор передается вместе с сообщением WM_CONTROL.

Параметры x и y определяют координаты органа управления относительно левого верхнего угла диалоговой панели. Используется единица длины dialog unit.

Параметры width и height определяют, соответственно, ширину и высоту органа управления в единицах длины dialog unit.

Параметр style определяет стиль органа управления (необязательный параметр). Это тот самый стиль, который указывается при вызове функции CreateWindow.

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

Обозначение органа управления Класс окна Описание и стиль, используемый по умолчанию
CHECHBOX button Переключатель в виде прямоугольника BS_CHECKBOX, WS_TABSTOP
CTEXT static Строка текста, выровненная по центру SS_CENTER, WS_GROUP
DEFPUSHBUTTON button Кнопка, выбираемая в диалоговой панели по умолчанию BS_DEFPUSHBUTTON, WS_TABSTOP
GROUPBOX button Прямоугольник, объединяющий группу органов управления BS_GROUPBOX
ICON static ПиктограммаSS_ICON Параметры width, height и style можно не указывать
LTEXT static Строка текста, выровненная по левой границе органа управления SS_LEFT, WS_GROUP
PUSHBUTTON button КнопкаBS_PUSHBUTTON, WS_TABSTOP
RADIOBUTTON button Переключатель в виде кружка (радиопереключатель) BS_RADIOBUTTON, WS_TABSTOP
RTEXT static Строка текста, выровненная по правой границе органа управления SS_RIGHT, WS_GROUP

Стили WS_TABSTOP и WS_GROUP будут описаны позже.

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

CtlType ID, x, y, width, height [,style]

В этом формате нет параметра "Текст", остальные параметры используются так же, как и в первом формате.

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

Обозначение органа управления Класс окна Описание и стиль, используемый по умолчанию
COMBOBOX combobox Список с окном редактирования CBS_SIMPLE, WS_TABSTOP
LISTBOX listbox Список LBS_NOTIFY, WS_BORDER
EDITTEX edit Редактор текста ES_LEFT, WS_BORDER, WS_TABSTOP
SCROLLBARS scrollbar Полоса просмотраSBS_HORZ

Третий формат описания органов управления наиболее универсальный:

CONTROL "Текст", ID, class, style, x, y, width, height

Этот формат позволяет описать орган управления, принадлежащий классу class, который указывается в виде строки символов. Вы можете использовать третий формат для описания предопределенных классов органов управления, таких как "button", "combobox", "edit", "listbox", "scrollbar", "static". Данный формат описания можно использовать для любых органов управления.

Функция диалога

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

BOOL CALLBACK _export DlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);

Вы можете выбрать для функции диалога любое имя.

Параметры функции диалога напоминают параметры функции окна. Все они, за исключением первого, имеют аналогичное назначение. Через первый параметр функции диалога передается идентификатор диалога hdlg, а не идентификатор окна hwnd.

В отличие от функции окна, функция диалога не должна вызывать функцию DefWindowProc для тех сообщений, которые она не желает обрабатывать. Если функция диалога обрабатывает сообщение, она должна вернуть значение TRUE, а если нет - FALSE.

Функция диалога не обрабатывает сообщения WM_CREATE, WM_PAINT, WM_DESTROY. При инициализации диалога в функцию диалога вместо сообщения WM_CREATE передается сообщение WM_INITDIALOG. Как правило, функция диалога всегда обрабатывает сообщения WM_INITDIALOG и WM_COMMAND.

Сообщение WM_INITDIALOG использует параметры wParam и lParam.

Параметр wParam содержит идентификатор органа управления, который первым получит фокус ввода после отображения диалоговой панели. Это первый орган управления, описанный в шаблоне диалога со стилем WM_TABSTOP. Параметр lParam содержит значение, передаваемое приложением при создании диалоговой панели.

Если в ответ на сообщение WM_INITDIALOG функция диалога возвращает значение TRUE, после создания диалоговой панели фокус ввода передается органу управления, идентификатор которого был записан в параметре wParam.

Если при инициализации диалоговой панели обработчик сообщения WM_INITDIALOG устанавливает фокус ввода на другой орган управления (вызывая функцию SetFocus), функция диалога должна вернуть значение FALSE.

Сообщение WM_COMMAND, поступающее в функцию диалога, передает сообщения или извещения от органов управления, расположенных в диалоговой панели. Крое этого, функция диалога может получить это сообщение с параметром wParam, равным константам IDOK и IDCANCEL, описанным в файле windows.h.

Сообщение с параметром IDOK поступает в функцию диалога в том случае, если пользователь нажал клавишу <Enter> в момент, когда ни одна из кнопок, расположенных в диалоговой панели, не имеет фокус ввода, и ни одна из кнопок не имеет стиль WS_DEFPUSHBUTTON. Если в диалоговой панели есть кнопка со стилем WS_DEFPUSHBUTTON, в описанной ситуации в функцию диалога поступает сообщение WM_COMMAND с параметром wParam, равным идентификатору этой кнопки.

Сообщение с параметром IDCANCEL появится тогда, когда пользовательзакроет диалоговую панель с помощью системного меню или клавиши <Esc>.

Обычно в диалоговой панели всегда создается одна клавиша, имеющая стиль WS_DEFPUSHBUTTON. Как правило, на этой клавише пишется слово "OK" и она используется для нормального завершения работы диалоговой панели. Для этой клавиши имеет смысл использовать идентификатор IDOK.

Еще одна клавиша, присутствующая практически во всех диалоговых панелях, имеет надпись "Cancel" и используется для отмены диалоговой панели. Если определить идентификатор этой клавиши как IDCANCEL, вы сможете использовать единый обработчик сообщения для отмены диалоговой панели при помощи кнопки и при помощи системного меню или клавиши <Esc>.



Дата добавления: 2016-07-22; просмотров: 1741;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.018 сек.