
- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки ok и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа colors
- •Программа hexcalc: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа poppad
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
Изменение шрифта
Как обеспечить пользователя возможностью легко выбирать себе шрифты показано в файле POPFONT.C.
При обработке сообщения WM_CREATE в программе POPPAD3 вызывается функция PopFontInitialize из файла POPFONT.C. Эта функция получает структуру LOGFONT, сформированную на основе системного шрифта, создает на ее базе шрифт и для установки нового шрифта посылает дочернему окну редактирования сообщение WM_SETFONT. (Хотя заданным по умолчанию шрифтом дочернего окна редактирования является системный шрифт, функция PopFontInitialize создает для него новый дополнительный шрифт, поскольку в конечном итоге все равно шрифт будет удален, что для стандартного системного шрифта было бы неразумным.)
Когда программа POPPAD3 при выборе опции шрифта получает сообщение WM_COMMAND, вызывается функция PopFontChooseFont. Эта функция инициализирует структуру CHOOSEFONT, а затем для вывода на экран диалогового окна выбора шрифта вызывает функцию ChooseFont. Если пользователь нажимает кнопку OK, возвращаемым значением функции ChooseFont будет TRUE. Тогда программа POPPAD3 вызывает функцию PopFontSetFont для установки в дочернем окне редактирования нового шрифта. Старый шрифт удаляется.
И наконец, при обработке сообщения WM_DESTROY, программа POPPAD3 вызывает функцию PopFontDeinitialize для удаления последнего шрифта, созданного функцией PopFontSetFont.
Поиск и замена
Библиотека диалоговых окон общего пользования включает в себя также два окна диалога для выполнения функций поиска и замены текста. В обеих этих функциях (FindText и ReplaceText) используется структура типа FINDREPLACE. В файле POPFIND.C, приведенном на рис. 11.11, для вызова этих функций имеются две других функции (PopFindFindDlg и PopFindReplaceDlg); кроме этого в нем имеются еще функции для поиска и замены текста в дочернем окне редактирования.
Имеется несколько замечаний, связанных с использованием функций поиска и замены. Во-первых, окна диалога, которые они вызывают, являются немодальными, что означает в случае активных окон диалога, необходимо изменять цикл обработки сообщений, чтобы вызвать функцию IsDialogMessage. Во-вторых, структура FINDREPLACE, передаваемая функциям FindText и ReplaceText, должна быть задана как статическая переменная; и поскольку окна диалога являются немодальными, то функции должны заканчивать свою работу уже после того, как окна диалога выведены на экран, а не после того, как они закрыты. И несмотря на это, необходимо продолжать обеспечивать возможность доступа к структуре из процедуры окна диалога.
В-третьих, до тех пор, пока окна диалога остаются на экране, функции FindText и ReplaceText взаимодействуют с окном-владельцем посредством специального сообщения. Номер этого сообщения может быть получен с помощью вызова функции RegisterWindowMessage с параметром FINDMSGSTRING. Это делается при обработке в WndProc сообщения WM_CREATE, и полученный номер сообщения сохраняется в статической переменной.
При обработке очередного сообщения в WndProc переменная сообщения сравнивается со значением, возвращаемым функцией RegisterWindowMessage. Параметр lParam сообщения — это указатель на структуру FINDREPLACE, поле Flags которое показывает, использовал ли пользователь окно диалога для поиска и замены текста или оно закрывается. Для непосредственной реализации поиска и замены в программе POPPAD3 вызываются функции PopFindFindDlg и PopFindReplaceDlg, находящиеся в файле POPFIND.C.