
- •Управление обменом и проверкой данных
- •Функции класса cWnd для манипулирования элементами управления диалогового окна
- •Связывание методов класса диалогового окна с элементами управления
- •Использование шрифтов в диалоговом окне
- •Некоторые стандартные шрифты Windows
- •Некоторые константы выравнивания текста
- •Задание 2. Создание класса диалогового окна и связывание его методов и атрибутов с элементами управления
- •Задание 3. Определение обработчиков сообщений, генерируемых элементами управления
- •Обработчики сообщения bn_clicked приложения FontDemo
- •Задание 4. Отображение диалогового окна и данных в его элементах управления
- •Задание 5. Отображение текста в окне представления в соответствии с выбранными в диалоговом окне атрибутами
Обработчики сообщения bn_clicked приложения FontDemo
Идентификатор объекта |
Тип элемента управления |
Имя обработчика сообщения |
IDC_BOLD |
Флажок |
OnBold |
IDC_CENTER |
Переключатель |
OnCenter |
IDC_FIXED |
Переключатель |
OnFixed |
IDC_ITALIC |
Флажок |
OnItalic |
IDC_LEFT |
Переключатель |
OnLeft |
IDC_RIGHT |
Переключатель |
OnRight |
IDC_UNDERLINE |
Флажок |
OnUnderline |
IDC_VARIABLE |
Переключатель |
OnVariable |
Если класс окна порождается от класса CView, то последний предоставляет обработчик сообщения WM_PAINT, вызывающий функцию CView::OnDraw() класса окна представления. Однако так как класс диалогового окна не порождается от класса CView, то перерисовку этого окна выполняет сама функция CWnd::OnPaint(). Обратите внимание: функция CWnd::OnPaint() должна создать объект контекста устройства, принадлежащий MFC-классу CPaintDC, а не классу CClientDC, используемому для создания объектов контекста устройства в других функциях.
Задание 4. Отображение диалогового окна и данных в его элементах управления
Мы написали код, управляющий диалоговым окном Format при его отображении, но в процессе работы программы диалоговое окно не отображалось. Обычно в приложениях Windows диалоговые окна открываются командами меню. Исключением является приложение, в котором диалоговое окно является главным окном. Для добавления команды меню, открывающей диалоговое окно Format, выполните следующие действия
Откройте окно редактора ресурса меню. выполнив двойной щелчок на идентификаторе IDR_MAINFRAME в узле Menu графа ресурсов.
Создайте меню как на рис. 6.14, заменив надпись File на надпись &Text, удалив из этого меню все комнады,.кроме Exit и добавив команду с надписью &Format...\tCtrl+F. Определите идентификатор команды ID_TEXT_FORMAT.
Если в процессе удаления команд меню был удален разделитель перед командой Exit, то вставьте его.
Сохраните изменения в файле сценария ресурсов, выполнив команду FileSave All
Чтобы при последующей работе с проектом (после его повторного открытия) в свойствах команд меню отображались введенные ранее идентификаторы, скорректируйте файл FontDemo.rc, заменив численное значение идентификатора команды &Format...\tCtrl+F на значение ID_TEXT_FORMAT, открыв этот файл в редакторе Notepad. Сохраните файл FontDemo.rc.
Затем в таблицу горячих клавиш AcceleratorIDR_MAINFRAME добавьте комбинацию клавиш для команды Format. Используйте метод, описанный в предыдущих главах, определяя одинаковый идентификатор ID_TEXT_FОRMАТ и для команды Format, и для комбинации клавиш Ctrl+F.
Когда ресурсы программы будут определены, сохраните результаты работы, выбрав команду Save All в меню File или щелкнув на кнопке Save All в стандартной панели инструментов Developer Studio.
Рис. 6.14. Меню Text программы FontDemo
Постройте программу и протестируйте ее, выполнив команду DebugStart. Вы увидите главное окно программы с заданными командами меню. Команда Format не доступна, поскольку отсутствует обработчик командного сообщения. Окно приложения показано на рис. 6.15.
Определите обработчик сообщения, получающий управление при выборе в меню команды Format или нажатии клавиш Ctrl+F. Для этого выполните п. п. 9 — 13 задания 4.
Откройте окно Class View и выберите класс CFontDemoDoc в списке классов, чтобы обработчик сообщений был добавлен в класс документа программы. В программе FontDemo выбор класса для обработки команды Format несколько произволен. Однако в реальных текстовых процессорах команда Format непосредственно воздействует на данные, сохраняемые в документе (а не на определенное представление документа или на приложение в целом). Поэтому рекомендуется обрабатывать команду с помощью класса документа.
Откройте окно Properties. Щелкните на кнопке Events (с изображением молнии) и раскроется список идентификаторов команд. Выберите идентификатор ID_TEXT_FORMAT, соответствующий команде меню TextFormat….. В списке сообщений выберите сообщение COMMAND и команду <Add> OnTextFormat. В файл заголовка класса документа добавится объявление функции CFontDemoDoc::OnTextFormat(), в файл реализации класса документа добавится ее шаблон.
В функцию CFontDemoDoc::OnTextFormat() добавьте код, в котором создайте экземпляр класса диалогового окна CFormatDlg и вызовите функцию CDialog::DoModal() для открытия модального диалогового окна. Для модального диалогового окна этот объект обычно определяется как локальная переменная, удаляемая сразу после завершения функции, в которой она определена.
void CFontDemoDoc::OnTextFormat() { // TODO: Add your command handler code here CFormatDlg m_FormatDlg; m_FormatDlg.DoModal (); }
Добавьте в файл FontDemoDoc.cpp реализации класса документа директиву препроцессора для включения файла заголовков FormatDlg.h, содержащего интерфейс класса диалогового окна, в его реализацию, чтобы можно было использовать константы с номерами переключателей и соответствующие стили.
#include "stdafx.h" #include "FontDemo.h" #include "FontDemoDoc.h" #include "FormatDlg.h"
Постройте программу и протестируйте ее.
Вы увидите окно, в котором команды меню Text доступны. Щелчок на команде Format отображает на экране диалоговое окно. Выбор переключателей и установка флажков приводят к отображению в области Sample образца текста.