void CExDialog::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CFtpDialog)
DDX_Control(pDX, IDC_NAME, m_name);DDX_Text(pDX, IDC_AGE, m_nAge);DDV_MinMaxInt(pDX, m_nAge, 1, 100);//}}AFX_DATA_MAP
}
class CDataExchange
{// Attributes
public:
BOOL m_bSaveAndValidate; // TRUE 則 保存和驗(yàn)證數(shù)據(jù)
CWnd* m_pDlgWnd; // 指向一個(gè)對(duì)話框
// Operations (for implementors of DDX and DDV procs)
HWND PrepareCtrl(int nIDC); //返回指定ID的控制窗口的句柄HWND PrepareEditCtrl(int nIDC); //返回指定ID的編輯控制窗口句柄…// Implementation
CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate);…};
CDataExchange::CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate){ASSERT_VALID(pDlgWnd);m_bSaveAndValidate = bSaveAndValidate;m_pDlgWnd = pDlgWnd;m_hWndLastControl = NULL;}
BOOL CWnd::UpdateData(BOOL bSaveAndValidate){ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
//創(chuàng)建CDataChange對(duì)象
CDataExchange dx(this, bSaveAndValidate);
…BOOL bOK = FALSE; // assume failure
TRY{//數(shù)據(jù)交換 DoDataExchange(&dx);
bOK = TRUE; // it worked
}CATCH(CUserException, e)//例外
{…}END_CATCH_ALL//恢復(fù)原來的值
…return bOK;
}
UpdataDate根據(jù)參數(shù)創(chuàng)建CDataExchange對(duì)象dx,如果參數(shù)為TRUE,dx用來寫數(shù)據(jù),否則dx用來讀數(shù)據(jù);然后調(diào)用DoDataExchange進(jìn)行數(shù)據(jù)交換。
static void AFX_CDECL DDX_TextWithFormat(CDataExchange* pDX,int nIDC,LPCTSTR lpszFormat, UINT nIDPrompt, ...)
{va_list pData; //用來處理個(gè)數(shù)可以變化的參數(shù)
va_start(pData, nIDPrompt);//得到參數(shù)
//得到編輯框的句柄
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);TCHAR szT[32];if (pDX->m_bSaveAndValidate) //TRUE,從編輯框讀出數(shù)據(jù){// the following works for %d, %u, %ld, %lu
//從編輯框得到內(nèi)容
::GetWindowText(hWndCtrl, szT, _countof(szT));//轉(zhuǎn)換編輯框內(nèi)容為指定的格式,支持“ %d, %u, %ld, %lu”
if (!AfxSimpleScanf(szT, lpszFormat, pData))
{AfxMessageBox(nIDPrompt);pDX->Fail(); //數(shù)據(jù)交換失敗
}}else //FALSE,寫入數(shù)據(jù)到編輯框{//把要寫的內(nèi)容轉(zhuǎn)換成指定格式
wvsprintf(szT, lpszFormat, pData);//不支持浮點(diǎn)運(yùn)算
//設(shè)置編輯框的內(nèi)容 AfxSetWindowText(hWndCtrl, szT);
}va_end(pData);//結(jié)束參數(shù)分析
}
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, long& value){if (pDX->m_bSaveAndValidate)
DDX_TextWithFormat(pDX, nIDC, _T("%ld"), AFX_IDP_PARSE_INT, &value);
else DDX_TextWithFormat(pDX, nIDC, _T("%ld"), AFX_IDP_PARSE_INT, value);}
void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl){if (rControl.m_hWnd == NULL) // 還沒有子類化{ASSERT(!pDX->m_bSaveAndValidate);//得到控制窗口句柄
HWND hWndCtrl = pDX->PrepareCtrl(nIDC);//把hWndCtrl窗口和MFC窗口對(duì)象rControl捆綁在一起
if (!rControl.SubclassWindow(hWndCtrl)) {
ASSERT(FALSE); //不允許兩次子類化
AfxThrowNotSupportedException();}#ifndef _AFX_NO_OCC_SUPPORT//OLE控制相關(guān)的操作
else
{// If the control has reparented itself (e.g., invisible control), // make sure that the CWnd gets properly wired to its control site. if (pDX->m_pDlgWnd->m_hWnd != ::GetParent(rControl.m_hWnd)) rControl.AttachControlSite(pDX->m_pDlgWnd);}#endif //!_AFX_NO_OCC_SUPPORT
}}
聯(lián)系客服