![]() |
|||||
![]() ![]() |
|||||
![]() |
![]() |
![]() |
![]() |
![]() |
|
|
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() . Это позволяет сохранить новые параметры в классе диалога и сделать их доступными для функций перерисовки изображения.
|