C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 45 - Имитация DDX / Диалоговые окна / Visual C++

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


| |
Автор Каев Артем.
[AD]