Шаг 34 - Понимание DDX

Создание проекта

Для работы применим прошлый проект. Но на диалоговое окно добавим элемент управления Edit - строка редактирования.

34_1.gif (4138 b)

Создаем код

Добавляем функции к классу диалогового окна.

class CTestDlg : public CDialog					// класс диалогового окна
{
public:
CTestDlg(CWnd* pParent=NULL);
virtual void DoDataExchange(CDataExchange* pDX); // функция обмена данными
void SetEditStr(CString csEdit); // установить строку
CString GetEditStr(); // получить строку

protected:
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; // Создать объект диалогового окна
m_pMainWnd = &dlg; // главное окно программы это диалоговое окно
dlg.SetEditStr("Hello DDX"); // установить данные
dlg.DoModal();
TRACE(dlg.GetEditStr()); // получить данные и вывести в окно отладки
return FALSE;
}

Вот так будет работать программа. Не забудьте для того, что бы видеть вывод отладочной информации Вам надо запустить программу в режиме отладки (F5).

34_2.gif (7245 b)

Описание

DDX - это реализация функций обмена данных с диалоговым окном. DDX работает на основе связи переменной и идентификатора элемента управления в окне. Естественно этот элемент управления должен соответствовать типу переменной.

Для реализации связи поля редактирования я завел переменную m_edit как строку CString в классе диалогового окна. И реализовал две функции для доступа к ней. Это функции SetEditStr и GetEditStr. В классе диалога описана виртуальная функция 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 для переключателя. Дальше я перед вызовом диалогового окна устанавливаю переменную, а после показываю значение.

Шпаргалка

Создайте переменную для связи.

class CTestDlg : public CDialog					// класс диалогового окна
{
..........
CString m_edit; // данные
};

Опишите функцию связи и её реализацию.

class CTestDlg : public CDialog					// класс диалогового окна
{
.....
virtual void DoDataExchange(CDataExchange* pDX); // функция обмена данными
....
};
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); // функция папы
DDX_Text(pDX, IDC_EDIT1, m_edit); // наш обмен
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.