Помочь своя DDX функция может, например, для связи элементов управления с переменными, которые этот тип не поддерживают автоматически. Возьмем, индикатор выполнения.
При загрузке диалогового окна произведем инициализацию.
BOOL CTestDDXDlg::OnInitDialog() { CDialog::OnInitDialog(); CProgressCtrl * cp; cp=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1); cp->SetRange(1,10); ....... }
И добавим кнопку Add, которая будет добавлять значения:
void CTestDDXDlg::OnAdd() { CProgressCtrl * cp; cp=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1); cp->StepIt(); }
Вот так может выглядеть программа перед закрытие окна, пользователь чего-то добавил.
Наша задача знать в числовом виде сколько было добавлений. Описываем свою DDX функцию.
class CTestDDXDlg : public CDialog { // Construction public: CTestDDXDlg(CWnd* pParent = NULL); // standard constructor void AFXAPI DDX_MyText(CDataExchange* pDx,int ID,CString& csDate ); // Dialog Data ..... };
Пишем реализацию.
void AFXAPI CTestDDXDlg::DDX_MyText(CDataExchange* pDx,int ID,CString& csDate ) { CProgressCtrl * cp; cp=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1); if (pDx->m_bSaveAndValidate) { int i; i=cp->GetPos(); itoa(i,csDate.GetBuffer(100) ,10); } else { cp->SetPos(atoi(csDate)); cp->Invalidate(); } }
И вписываем DDX функцию.
void CTestDDXDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestDDXDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP DDX_MyText(pDX,IDC_PROGRESS1,csDataProgress); }
Проверить легко. Установим при инициализации начальную позицию:
BOOL CTestDDXDlg::OnInitDialog() { csDataProgress="5"; CDialog::OnInitDialog(); CProgressCtrl * cp; cp=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1); cp->SetRange(1,10); // Add "About..." menu item to system menu. ....... };
И при запуске индикатор будет сразу по середине.
Можно будет добавить кнопку, которая будет вызывать DDX для сохранения в переменную и показывать сообщение о содержание переменной. Вы можете конечно потом и получать данные за пределы диалога и проводить внешнюю инициализацию.
void CTestDDXDlg::OnGet() { UpdateData(TRUE); AfxMessageBox(csDataProgress); }
Смотрим:
Конечно этот пример немного надуман. Но любые дополнительные компоненты созданные Вами могут совсем не поддерживаться с помощью DDX, что немного неудобно.