Диалоговое окно можно определить непосредственно в файле ресурсов или в файле *.dlg , который следует подключить к файлу ресурсов директивой cinclude, а не известной директивой #include .
Это связано с тем, что компилятор ресурсов несколько иначе понимает директиву #include, чем препроцессор Си. Если директива #include помещается в файле описания ресурсов до первого (любого!) оператора, то препроцессор компилятора ресурсов игнорирует во включаемом файле все, кроме директив #define. То есть, если вы хотите включать в файл описания ресурсов файл описания окон диалога *.dlg, то следует помещать директиву #include как можно позже в файле описания ресурсов, но ни в коем случае не сразу за первой строкой :
#include < windows. h >
#include < about. dlg > // Неверно – описание окна about включено не будет
Приведем формат шаблона диалогового окна и его краткое описание :
MyBox DIALOG [опции загрузки] [опции памяти] X, Y, W, H
[STYLE ...]
BEGIN
( описание органов управления )
END
По аналогии с предыдущими определениями ресурсов оператор DIALOG определяет имя ресурса (в нашем случае My_Box) и устанавливает опции загрузки и опции памяти. Опции загрузки те же, что мы встречали ранее: PRELOAD либо LOADONCALL. При использовании PRELOAD описание окна диалога загружается с диска сразу при загрузке приложения на выполнение, а при использовании LOADONCALL только при необходимости. Опции памяти нам также уже знакомы – FIXED, MOVEABLE и DISCARDABLE. FIXED запрещает Windows перемещать сегмент данных с описанием ресурса в памяти, MOVEABLE разрешает, а DISKARDABLE указывает Windows что он может при необходимости удалять из памяти сегмент с описанием ресурса. Флаги MOVEABLE и LOADONCALL используются по умолчанию.
За опциями загрузки и памяти следует четыре параметра. Первые два из них – X и Y – задают координаты диалогового окна относительно рабочей области родительского окна. Следующие два параметра – W и H – определяют соответствующую ширину и высоту диалогового окна.
Отметим, что координаты и размеры диалогового окна задают не в пикселах, а в единицах, зависящих от размера системного шрифта. Координата X и ширина задаются в четвертях (1/4) ширины символов, а координата Y и высота – в восьмых (1/8) частях высоты символов. Такой подход гарантирует, что окна диалога будут выглядеть одинаково вне зависимости от типа видеоадаптера.
Следующее поле – STYLE – соответствует параметру «тип окна» в функции CreateWindow. Как правило, в модальных диалоговых окнах используют флаги WS_POPUP и WS_DLGFRAME. Однако можно использовать и другие. Например, вы можете указать в поле STYLE флаги WS_POPUP и WM_CAPTION. В этом случае создается диалоговое окно с заголовком и простой рамкой. Заголовок позволяет перемещать диалоговое окно по экрану при помощи мыши. Если используется флаг WM_CAPTION, то можно разместить в заголовке диалогового окна какой-нибудь текст, добавив утверждение CAPTION к заголовку шаблона. Например
MyBox DIALOG 12, 12, 130, 80
STYLE WS_POPUP | WM_CAPTION
CAPTION « Dialog Box Caption »
BEGIN
{описание органов управления }
END
Если указан флаг WM_CAPTION, то, указав флаг WM_SYSMENU, можно добавить к диалоговому окну системное меню.
Если указать флаг WM_THICKFRAME, то диалоговое окно будет отображаться с широкой рамкой, что позволит пользователю изменять размеры диалогового окна, а это противоречит стилю Windows. Поэтому, как правило, этот флаг при описании диалогового окна не указывается.
При создании системного диалогового окна надо включить в поле STYLE флаг DS_SYSMODAL. Заметим, что если не указать поле STYLE , то по умолчанию для типа диалогового окна используются флаги WS_POPUP и WS_BORDER.
К диалоговому окну можно добавить меню. Для этого в шаблоне диалогового окна надо поместить следующее утверждение:
MENU my_menu
Здесь за оператором MENU должно быть указано имя меню, определенное ранее в файле ресурсов.
Органы управления диалогового окна определяются между ключевыми словами BEGIN и END. Возможно использование двух форматов :
control_type « text », nID, xPos, yPos, xWidth, yHeight, dwStyle
control_type nID, xPos, yPos, xWidth, yHeight, dwStyle
В обоих форматах на первом месте стоит параметр, определяющий тип органа управления. В представленной таблице указаны типы органов управления, которые можно использовать при описании диалогового окна, а также соответствующие им классы окон и флаги, установленные по умолчанию для параметра (dwStyle) формата описания органов управления. Кроме перечисленных в таблице флагов, для всех органов управления установлены флаги WS_CHILD и WS_VISIBLE.
Тип
| Класс окна
| Флаги
|
PUSHBUTTON
| button
| BS_PUSHBUTTON | WS_TABSTOP
|
DEFPUSHBUTTON
| button
| BS_DEFPUSHBUTTON | WS_TABSTOP
|
CHECKBOX
| button
| BS_CHECKBOX | WS_TABSTOP
|
RADIOBUTTON
| button
| BS_RADIOBUTTON
|
GROUPBOX
| button
| BS_GROUPBOX
|
LTEXT
| static
| SS_LEFT | WS_GROUP
|
CTEXT
| static
| SS_CENTER | WS_GROUP
|
RTEXT
| static
| SS_RIGHT | WS_GROUP
|
ICON
| static
| SS_ICON | WS_GROUP
|
EDITTEXT
| edit
| ES_LEFT | WS_BORDER | WS_TABSTOP
|
LISTBOX
| listbox
| LBS_NOTIFY | LBS_SORT |
WS_BORDER | WS_VSCROLL
|
Наиболее интересными с практической точки зрения являются флаги WS_GROUP и WS_TABSTOP. WS_TABSTOP устанавливается для всех органов управления диалогового окна, доступ к которым осуществляется посредством нажатия клавиши Tab. При этом фокус ввода при каждом нажатии на клавишу табуляции будет переходить к следующему органу управления, имеющему установленный флаг WS_TABSTOP.
Флаг WS_TABSTOP установлен по умолчанию для органов управления типа PUSHBUTTON, DEFPUSHBUTTON, CHECKBOX, RADIOBUTTON, EDITTEXT.
Флаг WS_GROUP позволяет использовать клавиши перемещения курсора для передачи фокуса ввода от одного органа управления к другому внутри группы. По умолчанию флаг WS_GROUP установлен для органов управления типа LTEXT, CTEXT, RTEXT, ICON. Органы управления перечисленных типов указывают на конец группы.
Следует отметить, что первый формат описания применяется для всех органов управления, перечисленных в таблице за исключением EDITTEXT и LISTBOX. Для EDITTEXT и LISTBOX используется второй формат описания.
Поле nID в форматах описания органов управления используется органом управления , когда от него поступает сообщение в родительское окно. Как правило, это сообщение WM_COMMAND, а параметр wParam равен nID. Сообщение от органа управления передается сначала функции окна Windows, а затем уже функции диалогового окна . Если орган управления не должен передавать сообщений функции диалогового окна , то можно присвоить полю nID значение -1.
Поле «text» в первом формате задает заголовок органа управления. Для получения большей информации об этом поле можете вернуться к главе «Органы управления».
Четыре поля : xPos, yPos, xWidth, yHeight,-- определяют координаты и размеры органа управления внутри диалогового окна. Как и поля X, Y, W и H в заголовке шаблона диалогового окна, они задаются не в пикселах, а в долях символов системного шрифта.
После описания окна диалога в файле ресурсов вы должны обеспечить пользователю возможность вызвать это окно посредством выбора соответствующего пункта меню.