Шаг 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.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 28.06.2002