- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки ok и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа colors
- •Программа hexcalc: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа poppad
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
Дополнительная информация об определении дочерних окон элементов управления
В шаблоне окна управления файла ABOUT1.RC, для определения трех типов дочерних окон элементов управления, которые появляются в окне диалога, использовалась сокращенная запись: CTEXT, ICON и DEFPUSHBUTTON. Можно использовать и другие идентификаторы. Каждый тип соответствует конкретному предопределенному классу окна и стилю окна. В представленной ниже таблице показаны соответствующие каждому типу дочерних окон элементов управления класс окна и стиль окна:
Тип элемента управления |
Класс окна |
Стиль окна |
PUSHBUTTON |
button |
BS_PUSHBUTTON | WS_TABSTOP |
DEFPUSHBUTTON |
button |
BS_DEFPUSHBUTTON | WS_TABSTOP |
CHECKBOX |
button |
BS_CHECKBOX | WS_TABSTOP |
RADIOBUTTON |
button |
BS_RADIOBUTTON | WS_TABSTOP |
GROUPBOX |
button |
BS_GROUPBOX | WS_TABSTOP |
LTEXT |
static |
SS_LEFT | WS_GROUP |
CTEXT |
static |
SS_CENTER | WS_GROUP |
RTEXT |
static |
SS_RIGHT | WS_GROUP |
ICON |
static |
SS_ICON |
EDITTEXT |
edit |
ES_LEFT | WS_BORDER | WS_TABSTOP |
SCROLLBAR |
scrollbar |
SBS_HORZ |
LISTBOX |
listbox |
LBS_NOTIFY | WS_BORDER | WS_VSCROLL |
COMBOBOX |
combobox |
CBS_SIMPLE | WS_TABSTOP |
Единственной программой, которая понимает эту краткую запись, является компилятор ресурсов (RC). Кроме показанных выше стилей окна, каждое из представленных дочерних окон элементов управления имеет стиль:
WS_CHILD | WS_VISIBLE
Для всех типов дочерних окон элементов управления, за исключением EDITTEXT, SCROLLBAR, LISTBOX и COMBOBOX, используется следующий формат инструкций, описывающих элементы управления:
control-type "text", id, xPos, yPos, xWidth, yHeight [, iStyle]
А для типов элементов управления EDITTEXT, SCROLLBAR, LISTBOX и COMBOBOX в формат инструкций определения не входит текстовое поле:
control-type id, xPos, yPos, xWidth, yHeight [, iStyle]
В обеих этих инструкциях поле iStyle не является обязательным.
В главе 8 рассказывалось о правилах задания ширины и высоты предопределенных дочерних окон элементов управления. Полезно было бы вернуться к этой главе и к этим правилам, учитывая, что размеры, которые указываются в шаблонах окон диалога, всегда задаются в единицах 1/4 средней ширины символа и 1/8 его высоты.
Поле стиля (style) инструкций определения окон элементов управления не является обязательным. Оно дает возможность включить в инструкцию другие идентификаторы стиля окна. Например, если необходимо создать флажок с текстом, находящимся слева от квадратного окна флажка, то можно было бы воспользоваться такой инструкцией:
CHECKBOX "text", id, xPos, yPos, xWidth, yHeight, BS_LEFTTEXT
Хотя сокращенная запись для дочерних окон управления весьма удобна, но она не является исчерпывающей. Например, нельзя создать дочернее окно управления без рамки. По этой причине в компиляторе файла описания ресурсов также определяется и обобщенная форма инструкции окна управления, которая выглядит так:
CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight
Эта инструкция, где можно задать класс окна и полностью определить стиль окна, дает возможность создать любой тип дочернего окна управления. Например, вместо инструкции:
PUSHBUTTON "OK", IDOK, 10, 20, 32, 14
можно использовать инструкцию:
CONTROL "OK", IDOK, "button", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP, 10, 20, 32, 14
При компиляции файла описания ресурсов две этих инструкции кодируются одинаково, как в файле с расширением .RES, так и в файле с расширением .EXE.
Если инструкция CONTROL используется в шаблоне окна диалога, нет необходимости включать в нее стили WS_CHILD и WS_VISIBLE. Windows включает их в стиль окна при создании дочерних окон. Кроме этого формат инструкции CONTROL облегчает понимание того, что делает менеджер окна диалога Windows, когда он создает окно диалога. Во-первых, как уже ранее говорилось, он создает всплывающее окно, родительское окно которого определяется описателем окна, заданным в функции DialogBox. Затем для каждой инструкции элемента управления в шаблоне диалога, менеджер окна диалога создает дочернее окно. Родительским окном каждого из этих дочерних окон управления является всплывающее окно диалога. Приведенная выше инструкция CONTROL преобразуется в вызов функции CreateWindow, которая выглядит следующим образом:
CreateWindow ("button", "OK",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
10 * cxChar / 4, 20 * cyChar / 8,
32 * cxChar / 4,14 * cyChar / 8,
hDlg, IDOK, hInstance, NULL) ;
где cxChar и cyChar — это ширина и высота символа системного шрифта в пикселях. Параметр hDlg является возвращаемым значением функции CreateWindow, которая создает окно диалога. Параметр hInstance получен при первом вызове функции DialogBox.
