http://tikitak.narod.ru ---- Главная страница сайта
Шаг 34 - Понимание DDX
Создание проекта
Для работы применим прошлый проект. Но на диалоговое окно добавим элемент управления Edit - строка редактирования.
Создаем код
Добавляем функции к классу диалогового окна.
class CTestDlg : public CDialog
{
public:
CTestDlg(CWnd* pParent);
virtual void DoDataExchange(CDataExchange* pDX);
void SetEditStr(CString csEdit);
CString GetEditStr();
protected:
virtual BOOL OnInitDialog();
CString m_edit;
};
Реализация этих функций
void CTestDlg::SetEditStr(CString csEdit)
{
m_edit=csEdit;
}
CString CTestDlg::GetEditStr()
{
return m_edit;
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_edit);
}
Изменяем BOOL CTestApp::InitInstance()
BOOL CTestApp::InitInstance()
{
CTestDlg dlg(NULL);
dlg.SetEditStr("Hello DDX");
dlg.DoModal();
AfxMessageBox(dlg.GetEditStr());
return FALSE;
}
Описание
DDX - это реализация функций обмена данных с диалоговым окном. DDX работает на основе связи переменной и идентификатора элемента управления в окне. Естесвенно этот элемент управления должен соответствовать типу переменной.
Для реализации связи поля редактирования я завел переменную m_edit как строку CString в классе диалогового окна. И реализовал две функции для доступа к ней. Это функции SetEditStr и SetEditStr.
В классе диалога описана виртуальная функция DoDataExchange, именно она отвечает за обмен данными. Вы не дожны вызывать эту функцию непосредсвенно, вызов её происходит из функции UpdateDate. Эта функция вызывается при создании окна, закрытия окна, но вы можете вызвать её в любой момент.
Внути этой функции вызывается метод папы. А дальше устанавливается связь, но связь может быть нескольких типов в зависимости от типа элемента управления и типа переменной. Например, если бы я хотел установить связь с этим же элементом управления, но не с текстовой строкой и с обьектом CEdit, то это выглядеть будет так
class CTestDlg : public CDialog
{
.......
CEdit m_edit;
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_edit);
}
Так тип связи зависит и от элемента управления. DDX_Radio для переключателя.
Дальше я перед вызовом диалогового окна устанавливаю переменную, а после показываю значение.
Запускайте. Введите в поле редактирования Hi и нажмите кнопку Ok. Посмотрите, что получится.
Шпаргалка
Создайте переменную для связи
class CTestDlg : public CDialog
{
.......
protected:
......
CString m_edit;
};
Опишите функцию связи и её реализацию
class CTestDlg : public CDialog
{
public:
........
virtual void DoDataExchange(CDataExchange* pDX);
........
};
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_edit);
........
}
Комментарии | Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|