- •Управление обменом и проверкой данных
- •Функции класса cWnd для манипулирования элементами управления диалогового окна
- •Связывание методов класса диалогового окна с элементами управления
- •Использование шрифтов в диалоговом окне
- •Некоторые стандартные шрифты Windows
- •Некоторые константы выравнивания текста
- •Задание 2. Создание класса диалогового окна и связывание его методов и атрибутов с элементами управления
- •Задание 3. Определение обработчиков сообщений, генерируемых элементами управления
- •Обработчики сообщения bn_clicked приложения FontDemo
- •Задание 4. Отображение диалогового окна и данных в его элементах управления
- •Задание 5. Отображение текста в окне представления в соответствии с выбранными в диалоговом окне атрибутами
Задание 2. Создание класса диалогового окна и связывание его методов и атрибутов с элементами управления
Для отображения диалогового окна на экране необходимо создать объект класса диалогового окна, для которого можно вызывать методы его класса. Для доступа к элементам управления диалогового окна необходимо включить в его класс атрибуты, которые могут соответствовать либо значению элемента управления, либо самому элементу управления как программному объекту. Для создания класса диалогового окна и добавления в него переменных-членов, соответствующих элементами управления, выполните следующие действия.
Откройте окно редактора ресурса шаблона диалогового окна IDD_DIALOG1. Для этого откройте окно Resource View, разверните список категорий ресурсов проекта FontDemo, затем список ресурсов шаблонов диалоговых окон Dialog, и, наконец, дважды щелкните на идентификаторе ресурса диалога IDD_DIALOG1.
Откройте окно MFC Class Wizard (Мастер создания классов), выполните команду Add Class или ProjectAdd Class, щелкнув дважды на поле диалогового окна (не на элементах управления) или в контекстном меню.
Введите следующие значения в поля окна MFC Class Wizard: в поле Class name (Имя класса) введите CFormatDlg, в поле Base class (Базовый класс) выберите CDialog, остальные поля оставьте без изменения. Обратите внимание: в поле Dialog ID задан идентификатор IDD_DIALOG1 диалогового окна Format (рис. 6.10). Нажмите кнопку Finish. В результате работы мастера создания класса созданы файлы интерфейса класса диалогового окна FormatDlg.h и реализации класса FormatDlg.cpp.
Рис. 6.9. Окно MFC Class Wizard в процессе создания класса диалогового окна Format
Доступ к элементам управления диалогового окна можно получить, добавив в класс диалогового окна атрибуты (переменные-члены класса). Для этого откройте окно Class View. Выберите класс CFormatDlg. В контекстном меню выполните команду Add Add Variable… (Добавить переменную). В окне Add Member Variable Wizard (Мастер добавления переменных-членов) установите флажок Control variable (Переменная элемента управления). Тем самым указывается, что атрибут будет связан с элементом управления. Выберите из списка Control ID (Идентификатор элемента управления) значение IDC_BOLD. В поле Control type уже установлено значение CHECK. В поле Category (Категория) выберите значение Value, при этом значение в поле Variable type (Тип переменной) изменится на BOOL (рис. 6.11). Следовательно, созданной переменной будет присваиваться значение TRUE или FALSE. Значение Value в списке Category означает создание переменной базового типа C++, а не объекта-члена. В поле Variable name (Имя переменной) введите имя переменной m_Bold и выберите значение public из списка Access (Доступ). В поле Comment можно ввести комментарии. Для завершения процесса добавления переменной нажмите кнопку Finish.
Рис. 6.10. Окно Add Member Variable Wizard в процессе связывания переменной m_Bold и флажка с идентификатором IDC_BOLD
Таким же образом добавьте переменные, связываемые с флажками Italic и Underline. В окне Add Member Variable Wizard выберите идентификатор элемента управления IDC_ITALIC, введите имя переменной m_Italic, выберите категорию Value и тип BOOL. Для флажка Underline задайте такие значения: в поле Control variable установите флажок, выберите идентификатор IDC_UNDERLINE, значение Value и тип BOOL, введите имя m_Underline, выберите тип доступа public.
Добавьте переменные, ассоциированные с переключателями. Переменная назначается на группу переключателей, а не на каждый из них. Перед отображением диалогового окна Format переменной присваивается номер того переключателя внутри группы, который отмечен первоначально. Значение 0 присваивается первому переключателю в группе (в порядке обхода), 1 — второму и т. д. Когда диалоговое окно Format открывается первый раз, MFC отмечает указанный переключатель (если присвоить переменной значение, равное –1, то в группе не будет отмечен ни один переключатель). И наоборот, когда пользователь щелкает на кнопке OK, MFC записывает в переменную номер отмеченного переключателя в группе (или значение, равное –1, если ни один переключатель не отмечен). Откройте окно Add Member Variable Wizard, выбрав класс CFormatDlg. Установите флажок Control variable. В списке идентификаторов выберите идентификатор IDC_LEFT— первый переключатель группы, начинающейся с переключателя Left. Введите имя переменной m_Justify, выберите категорию Value, введите значение типа int. Переменная типа int объявляется для хранения номера переключателя. В поле Access оставьте значение public. В поле Control type уже установлено значение RADIO.
Рис. 6.11. Установка диапазона значений для добавляемой переменной в окне Add Member Variable Wizard
Добавьте переменную с именем m_Pitch для группы переключателей IDC_VARIABLE, выполняя действия, описанные в п. 6.
Добавьте переменную m_Spacing для управляющего элемента с идентификатором IDC_SPACING. В диалоговом окне Add Member Variable Wizard установите флажок Control variable, выберите категорию Value, тип int вместо стандартного CString, чтобы текстовая строка, отображаемая в поле, могла быть преобразована в целое число. Введите диапазон допустимых значений: в поле Min value задайте значение 1, в поле Max value — значение 3 как на рис. 6.12. Переменная m_Spacing определяет междустрочный интервал, в программе разрешается установить только одинарный, двойной или тройной интервал между строками. Если в процессе работы программы в поле диалогового окна ввести число, выходящее за указанный диапазон, то MFC выведет предупреждение и диалоговое окно остается открытым.
Для управления полем ввода необходим объект класса CEdit, который инкапсулирован в класс CFormatDlg. Для этого в окне Add Member Variable Wizard установите флажок Control variable. В списке Control ID выберите идентификатор IDC_SPACING. Для одного элемента управления можно определять сразу две переменные при условии, что они принадлежат различным категориям, которые задаются значениями из списка Category. В списке Category выберите значение Control. Введите имя m_SpacingEdit. Теперь переменная является членом класса CEdit, а не базового типа С++. Класс CEdit предоставляет набор функций для управления полем. Для завершения определения переменной нажмите кнопку Finish.
Сохраните изменения по команде FileSave All, постройте и запустите программу по команде DebugStart или нажмите клавишу F5.
В результате выполнения действий п.п. 4 — 9 в файл интерфейса класса CFormatDlg будут добавлены объявления переменных-членов, как показано ниже полужирным шрифтом.
// CFormatDlg dialog class CFormatDlg : public CDialog { DECLARE_DYNAMIC(CFormatDlg) public: CFormatDlg(CWnd* pParent = NULL); // standard constructor virtual ~CFormatDlg(); // Dialog Data enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); //DDX/DDV //support DECLARE_MESSAGE_MAP() public: BOOL m_Bold; // флажки выбора стиля шрифта BOOL m_Italic; BOOL m_Underline; int m_Justify; //тип выравнивания текста int m_Pitch; //интервал между буквами текста int m_Spacing; //междустрочный интервал CEdit m_SpacingEdit; //поле ввода };
В реализацию конструктора класса CFormatDlg в файл FormatDlg.cpp мастер добавляет список инициализации переменных-членов (в примере выделено полужирным шрифтом). В метод CFormatDlg::DoDataExchange(), поддерживающий обмен данными между оперативной памятью и элементами управления диалогового окна, добавляются соответствующие макросы DDX, DDV.
// FormatDlg.cpp : implementation file // #include "stdafx.h" #include "FontDemo.h" #include "FormatDlg.h" // CFormatDlg dialog IMPLEMENT_DYNAMIC(CFormatDlg, CDialog) CFormatDlg::CFormatDlg(CWnd* pParent /*=NULL*/) : CDialog(CFormatDlg::IDD, pParent) , m_Bold(FALSE) , m_Italic(FALSE) , m_Underline(FALSE) , m_Justify(0) , m_Pitch(0) , m_Spacing(0) { } void CFormatDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Check(pDX, IDC_BOLD, m_Bold); DDX_Check(pDX, IDC_ITALIC, m_Italic); DDX_Check(pDX, IDC_UNDERLINE, m_Underline); DDX_Radio(pDX, IDC_LEFT, m_Justify); DDX_Radio(pDX, IDC_VARIABLE, m_Pitch); DDX_Text (pDX, IDC_SPACING, m_Spacing); DDV_MinMaxInt(pDX, m_Spacing, 1, 3); DDX_Control(pDX, IDC_SPACING, m_SpacingEdit); } BEGIN_MESSAGE_MAP(CFormatDlg, CDialog) END_MESSAGE_MAP() // CFormatDlg message handlers
В результате запуска программы вы получите главное окно, однако ни диалогового окна, ни форматированного текста в окне представления вы не увидите. Дело в том, что, связав переменные-члены класса диалогового окна с его элементами управления, вы получили возможность реализовать обмен данными между ними. Однако не предусмотрели, как запустить механизм обмена данными. Во-первых, в программе FontDemo нет возможности отобразить диалоговое окно на экране. Во-вторых, вы не связали элементы управления диалогового окна с методами, обрабатывающими сообщения, которые эти элементы генерируют. Таким образом, программа нуждается в доработке, что вы и выполните в задании 3.
