|
|
|||||
|
|||||
|
| |||||
3.3. Механизм обмена данными между элементами управления и программой DDX/DDV.Механизм обмена данными диалога (dialog data exchange, DDX) представляет собой простой способ инициализации элементов управления диалогового окна и получения вводимых пользователем данных. Механизм проверки данных диалога ( dialog data validation, DDV ) обеспечивает простой способ контроля данных, вводимых в диалоговом окне. Механизмы DDX и DDV реализованы в классе диалога и используют программную архитектуру, аналогичную описанной для карты сообщений. Переменные-члены класса диалога сопоставляются с элементами управления шаблона диалога, а с помощью глобальных MFC -функций выполняется обмен данными между переменными-членами и элементами управления, а также проверка данных, вводимых пользователем. При создании класса диалога ClassWizard добавляет в него код реализации базовой архитектуры DDX/DDV. Далее посредством ClassWizard Вы сможете добавлять в класс диалога переменные, соответствующие элементам управления шаблона диалога, и определять правила простейшей проверки данных, вводимых в эти элементы. При добавлении переменных-членов DDX ClassWizard выполняет следующие действия:
Функции DDX и DDV - это глобальные MFC -функции, предназначенные для обмена данными между элементами управления и переменными-членами класса диалога ( DDX -функции) и для контроля вводимых данных ( DDV -функции). В MFC имеется несколько DDX -функций, соответствующих разным типам элементов управления. Наиболее часто используются следующие функции:
В MFC также имеется несколько DDV -функций, соответствующих разным способам проверки, применяемым к строковым или числовым переменным:
Чтобы познакомиться с полным списком этих функций, введите DDX_ или DDV_ в поле Keyword вкладки Index справочной системы Visual C++ . Обычно переменная-член (а также DDX -функция) создается для каждого элемента управления диалогового окна, предназначенного для ввода данных или изменения его состояния. Однако контроль за данными осуществляют только в случаях, когда не допускается выход вводимых значений за границы допустимого диапазона. В следующих упражнениях средствами ClassWizard мы добавим переменные-члены DDX и определим критерии проверки данных.
Чтобы увидеть код, добавленный ClassWizard для реализации механизма DDX/DDV , откройте файл ConnectDialog.h и найдите описание новых переменных класса:
//{{AFX_DATA(CConnectDialog)
enum { IDD = IDD_CONNECTDIALOG };
CString m_strUserID;
CString m_strPassword;
int m_nAccess;
BOOL m_bConnect;
//}}AFX_DATA
Как и весь код, обслуживаемый ClassWizard , эти объявления находятся внутри блока //{{AFX_ . Найдите в файле ConnectDialog.cpp конструктор класса и код, добавленный ClassWizard для инициализации переменных по умолчанию:
//{{AFX_DATA_INIT(CConnectDialog)
m_strUserID = _T("");
m_strPassword = _T("");
m_nAccess = 0;
m_bConnect = FALSE;
//}}AFX_DATA_INIT
Обмен данными между элементами управления и приложением осуществляет функция CWnd::DoDataExchange() . Переопределяемая версия этой функции автоматически формируется средствами ClassWizard при создании класса, производного от CDialog . ClassWizard добавляет в нее обращения к DDX/DDV -функциям. Функция CConnectDialog::DoDataExchange() расположена в файле ConnectDialog.cpp и на данном этапе должна выглядеть следующим образом:
void CConnectDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CConnectDialog)
DDX_Text(pDX, IDC_USERID, m_strUserID);
DDV_MaxChars(pDX, m_strUserID, 15);
DDX_Text(pDX, IDC_PASSWORD, m_strPassword);
DDV_MaxChars(pDX, m_strPassword, 15);
DDX_Text(pDX, IDC_ACCESS, m_nAccess);
DDV_MinMaxInt(pDX, m_nAccess, 1, 5);
DDX_Check(pDX, IDC_CHECKCONTROL, m_bConnect);
//}}AFX_DATA_MAP
}
Параметр pDX , передаваемый DDX/DDV -функциям, представляет собой объект MFC -класса CDataExchange , инкапсулирующий контекст текущего обмена данными. Переменная m_bSaveAndValidate класса CDataExchange задает направление передачи данных. Если ее значение TRUE , то данные извлекаются из элемента управления для проверки и сохранения в переменной класса диалога. В противном случае ( FALSE ) данные передаются в обратном направлении - в диалоговое окно для изменения элемента управления. Реализация процесса обмена даннымиВызов функции DoDataExchange() осуществляется функцией CWnd::UpdateData() , в которой создается объект CDataExchange , передаваемый в качестве параметра сначала функции DoDataExchange() , а затем - DDX/DDV -функциям. Единственный параметр функции UpdateData() типа BOOL определяет направление передачи данных. Функция CDialog::OnInitDialog() , выполняемая при создании диалогового окна, вызывает UpdateData() с параметром FALSE для передачи в элементы управления значений соответствующих переменных-членов класса диалога. Когда пользователь щелкает в диалоговом окне ОК , стандартный обработчик CDialog::OnOK() вызывает UpdateData() с параметром TRUE для выполнения проверки данных и сохранения их в переменных-членах. Схема этого процесса показана на рисунке 1.
Вызов функции CWnd::UpdateData() реализует обмен данными и их проверку в любом месте программы. В качестве примера рассмотрим приложение для просмотра изображений, в котором допускается изменять разрешение и цвет изображения, манипулируя элементами управления немодального диалогового окна. Чтобы обновить изображение сразу же после изменения значений в элементах управления нужно вызвать UpdateData() . Это позволяет сохранить новые параметры в классе диалога и сделать их доступными для функций перерисовки изображения.
|