Задание 2. Создание класса диалогового окна и связывание его методов и атрибутов с элементами управления




Для отображения диалогового окна на экране необходимо создать объект класса диалогового окна, для которого можно вызывать методы его класса. Для доступа к элементам управления диалогового окна необходимо включить в его класс атрибуты, которые могут соответствовать либо значению элемента управления, либо самому элементу управления как программному объекту. Для создания класса диалогового окна и добавления в него переменных-членов, соответствующих элементами управления, выполните следующие действия.

1. Откройте окно редактора ресурса шаблона диалогового окна IDD_DIALOG1. Для этого откройте окно Resource View, разверните список категорий ресурсов проекта FontDemo, затем список ресурсов шаблонов диалоговых окон Dialog, и, наконец, дважды щелкните на идентификаторе ресурса диалога IDD_DIALOG1.

2. Откройте окно MFC Class Wizard (Мастер создания классов), выполните команду Add Class или Project4Add Class, щелкнув дважды на поле диалогового окна (не на элементах управления) или в контекстном меню.

3. Введите следующие значения в поля окна 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

 

4. Доступ к элементам управления диалогового окна можно получить, добавив в класс диалогового окна атрибуты (переменные-члены класса). Для этого откройте окно Class View. Выберите класс CFormatDlg. В контекстном меню выполните команду Add 4 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

 

5. Таким же образом добавьте переменные, связываемые с флажками Italic и Underline. В окне Add Member Variable Wizard выберите идентификатор элемента управления IDC_ITALIC, введите имя переменной m_Italic, выберите категорию Value и тип BOOL. Для флажка Underline задайте такие значения: в поле Control variable установите флажок, выберите идентификатор IDC_UNDERLINE, значение Value и тип BOOL, введите имя m_Underline, выберите тип доступа public.

6. Добавьте переменные, ассоциированные с переключателями. Переменная назначается на группу переключателей, а не на каждый из них. Перед отображением диалогового окна 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

 

7. Добавьте переменную с именем m_Pitch для группы переключателей IDC_VARIABLE, выполняя действия, описанные в п. 6.

8. Добавьте переменную m_Spacing для управляющего элемента с идентификатором IDC_SPACING. В диалоговом окне Add Member Variable Wizard установите флажок Control variable, выберите категорию Value, тип int вместо стандартного CString, чтобы текстовая строка, отображаемая в поле, могла быть преобразована в целое число. Введите диапазон допустимых значений: в поле Min value задайте значение 1, в поле Max value — значение 3 как на рис. 6.12. Переменная m_Spacing определяет междустрочный интервал, в программе разрешается установить только одинарный, двойной или тройной интервал между строками. Если в процессе работы программы в поле диалогового окна ввести число, выходящее за указанный диапазон, то MFC выведет предупреждение и диалоговое окно остается открытым.

9. Для управления полем ввода необходим объект класса CEdit, который инкапсулирован в класс CFormatDlg. Для этого в окне Add Member Variable Wizard установите флажок Control variable. В списке Control ID выберите идентификатор IDC_SPACING. Для одного элемента управления можно определять сразу две переменные при условии, что они принадлежат различным категориям, которые задаются значениями из списка Category. В списке Category выберите значение Control. Введите имя m_SpacingEdit. Теперь переменная является членом класса CEdit, а не базового типа С++. Класс CEdit предоставляет набор функций для управления полем. Для завершения определения переменной нажмите кнопку Finish.

10. Сохраните изменения по команде File4Save All, постройте и запустите программу по команде Debug4Start или нажмите клавишу 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.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: