Итак, мы сами попробуем сделать примерно тоже, что делает DDX. Даже функцию назовем очень близко. Создаем функцию и код в ней от переменной к элементу и обратно.
void CMyDialog::UpdateDataMi(BOOL b) { if (b==FALSE) { m_Ed1.SetWindowText(m_Ed1_str); } else { m_Ed1.GetWindowText(m_Ed1_str); } }
Осталось только вызывать эту функцию в нужный момент.
void CMyDialog::OnOK() { // TODO: Add extra validation here UpdateDataMi(TRUE); CDialog::OnOK(); } BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); UpdateDataMi(FALSE); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
Но все равно пока макросы в DDX нужны.
void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Control(pDX, IDC_EDIT1, m_Ed1); DDX_Text(pDX, IDC_EDIT2, m_Ed2); //}}AFX_DATA_MAP }
Дело в том, что данный макрос помимо всего остального еще и связывает элемент управления с классом. Для избавления от DDX макроса нам нужно это сделать самим, ручками. Убираем DDX макрос.
void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) // DDX_Control(pDX, IDC_EDIT1, m_Ed1); DDX_Text(pDX, IDC_EDIT2, m_Ed2); //}}AFX_DATA_MAP }
В OnIintDialog() свяжем класс с элементом управления.
BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); CWnd* hwnd=(CWnd*) GetDlgItem(IDC_EDIT1); m_Ed1.Attach(hwnd->m_hWnd); UpdateDataMi(FALSE); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
А по нажатию на OK отсоединим его:
void CMyDialog::OnOK() { // TODO: Add extra validation here UpdateDataMi(TRUE); m_Ed1.Detach(); CDialog::OnOK(); }
Конечно, отсоединять нужно при любом разрушении окна. Но пока задача не в этом. Все будет работать. Вот мы и практически сделали сами DDX.