Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Урок 23. Функции DDX / Уроки MFC / Visual C++
Visual C++. MFC Урок 23. Функции DDX
На прошлом уроке мы с вами создали диалоговое окно. В нем никаких элементов не было. Добавьте в него пару элементов - Edit и CheckBox. Идентификаторы для них оставьте по умолчанию (IDC_EDIT1 и IDC_CHECK1). После этого добавьте в класс CMyDlg пару переменных и методы для чтения и записи этих переменных:
class CMyDlg : public CDialog{ //наш класс - потомок CDialogpublic:
CMyDlg(CWnd* pParent=NULL);
// функция обмена даннымиvirtualvoid DoDataExchange(CDataExchange* pDX);
void SetStr(CString sData); // установить строку
CString GetStr(); // получить строкуvoid SetCheck(BOOL bCheck); // установить CheckBox
BOOL GetCheck(); // получить CheckBoxprotected:
CString m_sData; //строковая переменная
BOOL m_bCheck; //переменная - переключатель
};
Теперь займемся реализацией метода DoDataExchange:
void CMyDlg::DoDataExchange(CDataExchange* pDX){
//обязательно вызываем родительский метод
CDialog::DoDataExchange(pDX);
//обмениваем данные с Edit'ом
DDX_Text(pDX, IDC_EDIT1, m_sData);
//обмениваем данные с CheckBox'ом
DDX_Check(pDX, IDC_CHECK1, m_bCheck);
}
Таким образом наша программа показывает те значения в контролзах, которые мы и ожидаем.
Даваете теперь обсудим наш код более подробно. Мы ввели в наш класс CMyDlg виртуальный метод DoDataExchange (кстати, не рекомендуется вызывать этот метод напрямую). Если мы хотим, чтобы происходил обмен данных между переменными класса и элементами управления (не только обмен, но и проверка, но об этом в следующем уроке), то мы должны этот метод переопределить. Это мы и делаем в строках
void CMyDlg::DoDataExchange(CDataExchange* pDX){
//обязательно вызываем родительский метод
CDialog::DoDataExchange(pDX);
...
}
Сюда мы должны вставить вызовы функций DDX_... для всех наших элементов управления. Это мы делаем в строках
...
//обмениваем данные с Edit'ом
DDX_Text(pDX, IDC_EDIT1, m_sData);
//обмениваем данные с CheckBox'ом
DDX_Check(pDX, IDC_CHECK1, m_bCheck);
...
Этих функций достаточно много. Их имена начинаются на DDX (от слова eXchange). Например,
DDX_Text - для обмена текстовыми данными,
DDX_Check - для обмена данными логического типа,
DDX_Radio - для обмена данными типа int с группой радиокнопок,
DDX_Control - для обмена данными типа CWnd с некоторым элементом управления.
Все эти функции могут передавать данные как из переменной в элемент управления, так и в обратную сторону.