- •Задание 6. Добавление обработчиков сообщений для кнопок панели инструментов
- •Обработчики сообщений для кнопок панели инструментов программы MyPaint
- •Строка состояния
- •Задание 7. Добавление строки состояния
- •Отображение полей строки состояния
- •Изменение интерактивной справки
- •Подведение итогов
- •Глава 6. Создание модальных диалоговых окон
- •Диалоговые окна и ресурсы шаблонов диалоговых окон
- •Задание 1. Создание ресурса шаблона диалогового окна программы FontDemo
- •Элементы управления диалогового окна Format и их свойства
- •Классы диалоговых окон
- •Функции класса cDialog для управления диалоговыми окнами
- •Функции класса cDialog для манипулирования диалоговыми окнами
Классы диалоговых окон
Для каждого диалогового окна в приложении необходимо создать класс диалогового окна. Созданный ресурс шаблона диалогового окна без соответствующего класса диалогового окна использовать нельзя. Вы убедились в этом при запуске программы. Диалоговое окно в процессе работы программы на экране не появлялось. В класс диалогового окна, который порождается от класса CDialog, необходимо включить его атрибуты и методы, реализующие управление работой элементов управления. Класс диалогового окна создается с помощью MFC Class Wizard (Мастер создания классов). Этот же мастер связывает ресурсы шаблона диалогового окна с его классом. Технология программирования диалоговых окон предусматривает связывание методов и переменных-членов класса диалогового окна с его элементами управления. Но перед созданием класса диалогового окна рассмотрим классы и методы, на основе которых будет строиться дальнейшее изложение.
Функции класса cDialog для управления диалоговыми окнами
Класс диалогового окна порождается от класса CDialog, который, в свою очередь, порождается от класса CWnd. Оба эти класса предоставляют функции для управления диалоговыми окнами. Некоторые из этих функций воздействуют на отдельные элементы управления, находящиеся в диалоговом окне, другие — на группы элементов управления, а остальные — непосредственно на диалоговые окна. Обычно эти функции вызываются обработчиками сообщений класса диалогового окна, получающих управление при отображении данного окна.
Для получения диалогового окна пользователя необходимо определить объект класса диалогового окна. Для этого используются конструктор порожденного от CDialog класса. Этот конструктор запускает конструктор CDialog. Последний принимает в качестве аргументов идентификатор ресурса шаблона диалогового окна и указатель на объект родительского окна или окна-владельца, которому принадлежит объект диалога. Заголовочный файл класса диалогового окна содержит константу IDD, которой присвоен идентификатор диалогового ресурса, обычно IDD_DIALOG1. Прототипы конструктора класса CDialog такие:
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL ); CDialog();
Конструктор имеет такие параметры: lpszTemplateName — указатель на имя ресурса шаблона диалогового окна; nIDTemplate — идентификатор ресурса шаблона диалогового окна, обычно с префиксом IDD; pParentWnd — указатель на объект родительского окна или окна-владельца, если это значение NULL, то диалоговое окно является главным окном приложения.
Пусть класс CFormatDlg производный от класса CDialog. Тогда его конструктор генерируется мастером создания каркаса приложения в таком виде:
CFormatDlg::CFormatDlg(CWnd* pParent /*=NULL*/) : CDialog(CFormatDlg::IDD, pParent) { }
Класс диалогового окно является производным от класса окна CWnd и имеет свою оконную процедуру, называемую процедурой диалогового окна, которая обрабатывает поступающие диалоговому окну сообщения. Диалоговому окну поступают сообщения WM_INITDIALOG и WM_COMMAND. В ответ на сообщение WM_INITDIALOG, которое посылает Windows, процедура диалогового окна инициализирует элементы управления диалога перед его отображением. При получении такого сообщения MFC автоматически вызывает виртуальную функцию CDialog::OnInitDialog(), которую необходимо переопределить в программе с целью инициализации элементов управления. Прототип этой функции показан ниже. Функция возвращает значение TRUE, если фокус ввода не установлен на элементе управления.
virtual BOOL CDialog::OnInitDialog();
После создания объекта диалогового окна и инициализации элементов управления модальное диалоговое окно активизируется методом CDialog::DoModal(). Эта функция управляет взаимодействием пользователя с модальным диалоговым окном и делает невозможным работу пользователя с другими окнами до закрытия модального окна. Пока модальное диалоговое окно открыто, функция CDialog::DoModal() не завершается. Если его закрыть, щелкнув на кнопке OK, то функция CDialog::DoModal() возвращает значение IDOK. В этом случае MFC автоматически проверяет и передает текущее содержимое элементов управления соответствующим переменным объекта диалогового окна. При нажатии кнопки Cancel функция CDialog::DoModal() возвращает значение IDCANCEL, в результате чего MFC не проверяет и не сохраняет содержимое элементов управления. Функция имеет такой прототип:
virtual int CDialog::DoModal();
Когда мастер MFC Class Wizard создает класс диалогового окна, то он сохраняет идентификатор IDD_DIALOG1 ресурса шаблона диалогового окна в определении класса в виде перечисления enum{IDD = IDD_DIALOG1}. Когда создается объект класса диалогового окна, конструктор класса передает этот идентификатор конструктору класса CDialog, сохраняющему данное значение. Наконец, при отображении диалогового окна функция CDialog::DoModal() передает идентификатор системе, чтобы соответствующий ресурс шаблона диалогового окна использовался для отображения окна.
Для закрытия модального диалогового окна используется функция CDialog::EndDialog(), которой передается значение, возвращаемое функцией CDialog::DoModal(). Прототип функции следующий:
void CDialog::EndDialog( int nResult );
По умолчанию модальное диалоговое окно закрывается при щелчке на кнопках Cancel или OK. Эти кнопки имеют идентификаторы IDCANСEL и IDOK, которые определены Windows. Класс CDialog содержит встроенные обработчики сообщений, генерируемые идентификаторами этих элементов управления. После щелчка на кнопке OK управление получает функция CDialog::OnOK(), которая вызывает функцию CWnd::UpdateData(), чтобы проверить и передать данные из элементов управления диалогового окна в связанные с ними переменные, а затем в функцию CDialog::EndDialog() для закрытия диалогового окна. Если нажать кнопку Cancel, то управление получит функция CDialog::OnCancel(), которая вызывает функцию CDialog::EndDialog() для закрытия диалогового окна. Эти функции можно переопределять, чтобы реализовать собственные действия, связанные с закрытием диалогового окна. Для этих функций определены такие прототипы:
virtual void CDialog::OnCancel(); virtual void CDialog::OnOK();
Перечень некоторых функций класса CDialog приводится в табл. 6.2
Т а б л и ц а 6.2
