
- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки ok и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа colors
- •Программа hexcalc: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа poppad
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
Вызов окна диалога
При обработке в WndProc сообщения WM_CREATE, программа ABOUT1 получает описатель экземпляра программы и сохраняет его в статической переменной:
hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;
Программа ABOUT1 обрабатывает те сообщения WM_COMMAND, в которых младшее слово параметра wParam равно IDM_ABOUT. Когда программа его получает, она вызывает функцию DialogBox :
DialogBox(hInstance, "AboutBox", hwnd, AboutDlgProc);
Для этой функции требуется описатель экземпляра (сохраненный при обработке сообщения WM_CREATE), имя окна диалога (как оно определено в файле описания ресурсов), описатель родительского окна окна диалога (которым является главное окно программы) и адрес процедуры диалога. Если вместо имени шаблона окна диалога используется число, то с помощью макрокоманды MAKEINTRESOURCE его можно преобразовать в строку.
Выбор из меню пункта "About About1..." приводит к выводу на экран окна диалога, показанного на рис. 11.2. Закрыть это окно диалога можно, щелкнув на кнопке OK мышью, нажав клавишу <Spacebar> или <Enter>. При нажатии клавиш <Spacebar> или <Enter> в любом окне диалога, в котором имеется кнопка по умолчанию, Windows посылает диалоговой процедуре сообщение WM_COMMAND, в котором младшее слово параметра wParam равно идентификатору заданной по умолчанию кнопки.
Функция DialogBox, которая вызывается для вывода на экран окна диалога, не возвращает управление в WndProc до тех пор, пока окно диалога не будет закрыто. Возвращаемым значением функции DialogBox является второй параметр функции EndDialog, которая вызывается в процедуре диалога. (Это значение не используется в программе ABOUT1, но используется в программе ABOUT2.) Затем WndProc может передать управление Windows.
Даже при выводе на экран окна диалога, WndProc может продолжать получать сообщения. Вы даже можете посылать в WndProc сообщения из процедуры диалога. Поскольку главным окном программы ABOUT1 является родительское окно всплывающего окна диалога, то вызов функции SendMessage в AboutDlgProc должен начинаться следующим образом:
SendMessage (GetParent(hDlg), ...) ;
Рис. 11.2. Окно диалога программы ABOUT1
Дополнительная информация о стиле окна диалога
Стиль окна диалога задается в строке STYLE шаблона окна диалога. Для программы ABOUT1 использовался стиль, который наиболее часто используется для модальных окон диалога:
STYLE WS_POPUP | WS_DLGFRAME
Однако вы можете также поэкспериментировать с другими стилями. Например, можно попытаться использовать такой стиль:
STYLE WS_POPUP | WS_CAPTION
Такой стиль позволяет создать окно диалога со строкой заголовка и обычной для окна рамкой. Строка заголовка дает возможность пользователю с помощью мыши перемещать окно диалога по экрану. Если используется стиль WS_CAPTION, то координаты х и у, задаваемые в инструкции DIALOG, являются координатами рабочей области окна диалога относительно верхнего левого угла рабочей области родительского окна. Строка заголовка будет располагаться выше координаты у.
При наличии строки заголовка следом за инструкцией STYLE в шаблоне окна диалога можно задать текст заголовка с помощью инструкции CAPTION:
CAPTION "Dialog Box Caption"
Можно сделать то же самое с помощью функции SetWindowText при обработке сообщения WM_INITDIALOG в процедуре диалога:
SetWindowText (hDlg, "Dialog Box Caption") ;
Кроме этого, при условии использования стиля WS_CAPTION с помощью стиля WS_SYSMENU к окну диалога можно добавить системное меню:
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU
Такой стиль позволяет пользователю выбрать из системного меню опции Move или Close.
Добавление к стилю идентификатора WS_THICKFRAME дает возможность пользователю изменять размер окна диалога, хотя такое изменение размера для окон диалога является делом необычным. Аналогично обстоит дело и с идентификатором WS_MAXIMIZEBOX.
Инструкция STYLE не является необходимой. Если в шаблон не включать инструкцию STYLE или CAPTION, то по умолчанию задается следующий стиль:
WS_POPUP | WS_BORDER
Но окно такого стиля смотрится хуже. Идентификатор WS_DLGFRAME обеспечивает гораздо более привлекательные результаты. Если к инструкции STYLE добавить инструкцию CAPTION, то по умолчанию задается следующий стиль:
WS_POPUP | WS_CAPTION | WS_SYSMENU
Кроме этого, меню к окну диалога можно добавить с помощью следующей инструкции в шаблоне окна диалога:
MENU menu-name
Аргументом является либо имя, либо номер меню в файле описания ресурсов. Меню в модальных окнах диалога – вещь очень необычная. И если оно используется, то необходима уверенность в том, что все идентификаторы меню и дочерних окон элементов управления окна диалога являются уникальными.
Инструкция FONT позволяет использовать в тексте окна диалога какой-либо иной шрифт, отличный от системного.
Хотя оконная процедура окна диалога обычно находится внутри Windows, для обработки сообщений окна диалога можно использовать одну из собственных оконных процедур. Для этого в шаблоне окна диалога необходимо задать имя класса окна:
CLASS "class-name"
Это делается редко, но тем не менее именно такой подход применяется в представленной далее в этой главе программе HEXCALC.
Когда вызывается функция DialogBox с указанием имени шаблона окна диалога, Windows уже имеет почти все необходимое для создания всплывающего окна с помощью обычной функции CreateWindow. Windows получает координаты и размеры окна, стиль окна, заголовок и меню из шаблона окна диалога. Описатель экземпляра и описатель родительского окна Windows получает из параметров функции DialogBox. Единственной недостающей частью информации является класс окна (если он не задан в шаблоне окна диалога). Для окон диалога Windows регистрирует особый класс окна. Оконная процедура для такого класса окна имеет доступ к указателю на процедуру диалога приложения (который передается в функцию DialogBox), таким образом Windows может информировать программу о сообщениях, получаемых этим всплывающим окном. Конечно, вы можете сами создать и поддерживать собственное диалоговое окно путем создания всплывающего окна. Использование функции DialogBox значительно облегчает дело.