Шаг 53 - Своя DDX функция

Помочь своя DDX функция может, например, для связи элементов управления с переменными, которые этот тип не поддерживают автоматически. Возьмем, индикатор выполнения.

53_1.gif (10476 b)

При загрузке диалогового окна произведем инициализацию.

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();  
}

Вот так может выглядеть программа перед закрытие окна, пользователь чего-то добавил.

53_2.gif (4070 b)

Наша задача знать в числовом виде сколько было добавлений. Описываем свою 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.
	.......
};

И при запуске индикатор будет сразу по середине.

53_3.gif (3777 b)

Можно будет добавить кнопку, которая будет вызывать DDX для сохранения в переменную и показывать сообщение о содержание переменной. Вы можете конечно потом и получать данные за пределы диалога и проводить внешнюю инициализацию.

void CTestDDXDlg::OnGet() 
{
	UpdateData(TRUE);
	AfxMessageBox(csDataProgress);	
}

Смотрим:

53_4.gif (2770 b)

Конечно этот пример немного надуман. Но любые дополнительные компоненты созданные Вами могут совсем не поддерживаться с помощью DDX, что немного неудобно.


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