![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
![]() |
Шаг 45 - Имитация DDXИтак, мы сами попробуем сделать примерно тоже, что делает 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. | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|