
- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки ok и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа colors
- •Программа hexcalc: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа poppad
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
Творческое использование идентификаторов дочерних окон элементов управления
В программе HEXCALC нет заголовочного файла с идентификаторами всех дочерних окон управления, определенных в шаблоне окна диалога. Обойтись без этого файла можно, поскольку идентификационным номером каждой из кнопок установлен код ASCII того текста, который появляется на кнопке при ее выводе на экран. Это означает, что WndProc может обращаться с сообщениями WM_COMMAND и WM_CHAR почти одинаково. В каждом случае параметр wParam является кодом ASCII текста кнопки.
Конечно, небольшая модификация сообщений от клавиатуры все же необходима. WndProc обрабатывает сообщения WM_KEYDOWN таким образом, чтобы преобразовать клавишу "стрелка влево" в клавишу <Backspace>. При обработке сообщений WM_CHAR WndProc преобразует код символов к верхнему регистру, а клавишу <Enter> к ASCII-коду клавиши <Equals>.
Правильность сообщений WM_CHAR контролируется с помощью вызова функции GetDlgItem. Если возвращаемым значением функции является 0, то значит символ клавиатуры не является одним из идентификаторов, определенных в шаблоне окна диалога. Однако, если символ один из этих идентификаторов, то соответствующей кнопке посылается пара сообщений BM_SETSTATE, так, что она в момент нажатия "залипает":
hButton = (GetDlgItem (hwnd, wParam) ;
if (hButton != NULL)
{
SendMessage (hButton, BM_SETSTATE, 1, 0) ;
SendMessage (hButton, BM_SETSTATE, 0, 0) ;
}
Это с минимальными усилиями делает более привлекательным процесс нажатия клавиш в интерфейсе программы HEXCALC.
Когда WndProc обрабатывает сообщения WM_COMMAND, она всегда помещает фокус ввода в родительское окно:
case WM_COMMAND :
SetFocus (hwnd) ;
В противном случае фокус ввода оказался бы на одной из кнопок, независимо от того, был ли на ней щелчок мыши.
Диалоговые окна общего пользования
Одной из первостепенных задач Windows было содействовать созданию стандартизированного интерфейса пользователя. Для многих общепринятых пунктов меню это было сделано достаточно быстро. Почти все производители программного обеспечения для открытия файла использовали последовательность Alt-File-Open. Однако, сами окна диалога для открытия файла часто были совершенно непохожи.
Начиная с версии Windows 3.1, решение этой задачи было найдено и продолжает обеспечиваться под Windows 95. Этим решением стала библиотека диалоговых окон общего пользования (common dialog box library). В этой библиотеке содержатся несколько функций, которые вызывают стандартные окна диалога для открытия и сохранения файлов, поиска и замены, выбора цветов и шрифтов (все это будет показано в этой главе) и для печати (о чем будет рассказано в главе 15).
Для использования этих функций в первую очередь необходимо инициализировать поля структуры и передать функции библиотеки диалоговых окон общего пользования указатель на эту структуру. Функции создают и отображают окно диалога. Когда пользователь закрывает окно диалога, вызванная функция возвращает управление программе, и пользователь получает информацию из структуры, указатель на которую был передан функции.
Функции и структуры, которые необходимы для использования этих окон диалога, определяются в заголовочном файле COMMDLG.H. Файл COMDLG32.LIB представляет собой библиотеку импорта диалоговых окон общего пользования, а файл COMDLG32.DLL — это динамически подключаемая библиотека, в которой содержатся шаблоны и процедуры окон диалога.