




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、MFC編輯框的數(shù)據(jù)交換分類:Win程序開發(fā)2009-11-02 10:26805人閱讀評(píng)論(0)收藏舉報(bào) 對(duì)話框數(shù)據(jù)交換指以下兩種動(dòng)作,或者是把內(nèi)存數(shù)據(jù)寫入對(duì)應(yīng)的控制窗口,或者是從控制 窗口讀取數(shù)據(jù)并保存到內(nèi)存變量中。MFC為了簡(jiǎn)化這些操作,以CDataExchange類和一 些數(shù)據(jù)交換函數(shù)為基礎(chǔ),提供了一套數(shù)據(jù)交換和校驗(yàn)的機(jī)制。數(shù)據(jù)交換的方法首先,定義保存數(shù)據(jù)的內(nèi)存變量一給對(duì)話框添加成員變量,每個(gè)控制窗口可以對(duì)應(yīng)一個(gè)成 員變量,或者是控制窗口類型,或者是控制窗口表示的數(shù)據(jù)的類型。例如,對(duì)于對(duì)話框的一 個(gè)編輯控制窗口,可以定義一個(gè)CEdit類型的成員變量,或者一個(gè)CString類型的成員變量。
2、其次,覆蓋對(duì)話框的虛擬函數(shù)DoDataExchange,實(shí)現(xiàn)數(shù)據(jù)交換和驗(yàn)證。ClassWizard可以協(xié)助程序員自動(dòng)地添加成員變量,修改DoDataExchange。例如,一個(gè)對(duì) 話框有兩個(gè)控制窗口,其中的一個(gè)編輯框表示姓名,ID是IDC_NAME,另一個(gè)編輯框表示 年齡,ID是IDC_AGE,ClassWizard添加如下的成員變量:/ Dialog Data/AFX_DATA(CExDialog)enum IDD = IDD_DIALOG2 ;CEdit m_name;int m_iAge;/AFX_DATA使用ClassWizard添加成員變量中,一個(gè)定義為CEdit,另一個(gè)定義為int
3、。這些定義被 7/AFX_DATA,和7/AFX_DATA,引用,表示是ClassWizard添加的,程序員不必修改它 們。相應(yīng)的DoDataExchange的實(shí)現(xiàn)如下: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_MA
4、PDDX_ Control表示把IDC_NAME子窗口的內(nèi)容傳輸?shù)酱翱?m_name,或者相反。DDX_ Text表示把IDC_AGE子窗口的內(nèi)容按整數(shù)類型保存到m_nAge,或者相反。DDV_MinMaxInt表示m_nAge應(yīng)該在1和100之間取值。CDataExchange上文中提到DDX_Xxxxx數(shù)據(jù)交換函數(shù)可以進(jìn)行雙向的數(shù)據(jù)交換,那么它們?nèi)绾沃罃?shù)據(jù)傳 輸?shù)姆较蚰??這通過DDX_Xxxxx函數(shù)的第一個(gè)參數(shù)pDX (也就是DoDataEx change的參 數(shù)pDX)所指的CDataExchange對(duì)象來(lái)決定,pDX指向一個(gè)CdataExchange對(duì)象。CDataExchange
5、定義如下:class CDataExchange/ Attributes public:BOOL m_bSaveAndValidate;/ TRUE 貝【J 保存和驗(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的編輯控制窗口句柄/ ImplementationCDataExchange(CWnd* pDlgWnd, BOO
6、L bSaveAndValidate);DoDataExchange 類似于 Serialize 函數(shù),CDataExchange 類似于 CArchive。CDataExchange使用成員變量m_pDlgWnd保存要進(jìn)行數(shù)據(jù)交換的對(duì)話框,使用成員變量 m_bSaveAndValidate指示數(shù)據(jù)傳輸?shù)姆较颍绻撟兞空?,則從控制窗口讀取數(shù)據(jù)到成員 變量,如果假,則從成員變量寫數(shù)據(jù)到控制窗口。在構(gòu)造一個(gè)CDataExchange對(duì)象時(shí),將保存有關(guān)信息在對(duì)象的成員變量中。構(gòu)造函數(shù)如下:CDataExchange:CDataExchange(CWnd* pDlgWnd, BOOL bSaveAn
7、dValidate)ASSERT_VALID(pDlgWnd);m_bSaveAndValidate = bSaveAndValidate;m_pDlgWnd = pDlgWnd;m_hWndLastControl = NULL;構(gòu)造函數(shù)參數(shù)指定了進(jìn)行數(shù)據(jù)交換的對(duì)話框pDlgWnd和數(shù)據(jù)傳輸方向bSaveAndValidate。1 UpdateData 函數(shù)有了數(shù)據(jù)交換類和數(shù)據(jù)交換函數(shù),怎么來(lái)使用它們呢? MFC設(shè)計(jì)了 UpdateData函數(shù)來(lái)完 成上述數(shù)據(jù)交換和驗(yàn)證的處理。首先,UpdateData創(chuàng)建CDataExchange對(duì)象,然后調(diào)用DoDataExchange函數(shù)。其實(shí)現(xiàn)如下:B
8、OOL CWnd:UpdateData(BOOL bSaveAndValidate)(ASSERT(:IsWindow(m_hWnd); / calling UpdateData before DoModal?創(chuàng)建CDataChange對(duì)象CDataExchange dx(this, bSaveAndValidate); BOOL bOK = FALSE;/ assume failureTRY(數(shù)據(jù)交換DoDataExchange(&dx);bOK = TRUE;/ it workedCATCH(CUserException, e)/例 外( END_CATCH_ALL恢復(fù)原來(lái)的值return
9、 bOK;UpdataDate根據(jù)參數(shù)創(chuàng)建CDataExchange對(duì)象dx,如果參數(shù)為TRUE, dx用來(lái)寫數(shù)據(jù), 否則dx用來(lái)讀數(shù)據(jù);然后調(diào)用DoDataExchange進(jìn)行數(shù)據(jù)交換。222 數(shù)據(jù)交換和驗(yàn)證函數(shù)在進(jìn)行數(shù)據(jù)交換或者驗(yàn)證時(shí),首先使用PrePareCtrl或者PrePareEditCtrl得到控制窗口的 句柄,然后使用:GetWindowsText從控制窗口讀取數(shù)據(jù),或者使用:SetWindowsText寫入 數(shù)據(jù)到控制窗口。下面討論幾個(gè)例子:static void AFX_CDECL DDX_TextWithFormat(CDataExchange* pDX,int nIDC,
10、LPCTSTR lpszFormat, UINT nIDPrompt, .)(va_list pData; /用來(lái)處理個(gè)數(shù)可以變化的參數(shù)va_start(pData, nIDPrompt);/得 到參數(shù)得到編輯框的句柄HWND hWndCtrl = pDX-PrepareEditCtrl(nIDC);TCHAR szT32;if (pDX-m_bSaveAndValidate)/TRUE,從編輯框讀出數(shù)據(jù)(/ the following works for %d, %u, %ld, %lu從編輯框得到內(nèi)容:GetWindowText(hWndCtrl, szT, _countof(szT);轉(zhuǎn)
11、換編輯框內(nèi)容為指定的格式,支持“ %d, %u, %ld, %lu”if (!AfxSimpleScanf(szT, IpszFormat, 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ù)分析DDX_TextWithFormat 用來(lái)按照一定的格式把數(shù)據(jù)寫入或者讀出編輯框。
12、首先,它得 到編輯框的句柄hWndCtrl,然后,根據(jù)傳輸方向從編輯框讀出內(nèi)容并轉(zhuǎn)換成指定格式(讀 出時(shí)),或者轉(zhuǎn)換內(nèi)容為指定格式后寫入編輯框(寫入時(shí))。本函數(shù)可以處理個(gè)數(shù)不定的參數(shù), 是多個(gè)數(shù)據(jù)交換和驗(yàn)證函數(shù)的基礎(chǔ)。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);elseDDX_TextWithFormat(pDX, nlDC, _
13、T(%ld), AFX_IDP_PARSE_INT, value);上述DDX_TEXT用來(lái)在編輯框和long類型的數(shù)據(jù)成員之間交換數(shù)據(jù)。MFC提供了 DDX_TEXT的多個(gè)重載函數(shù)處理編輯框和不同類型的數(shù)據(jù)成員之間的數(shù)據(jù)交換。DDX_Control下面的DDX_Control用于得到一個(gè)有效的控制類型窗口對(duì)象(MFC對(duì)象)。void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl)(if (rControl.m_hWnd = NULL) / 還沒有子類化(ASSERT(!pDX-m_bSaveAndValidat
14、e);得到控制窗口句柄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
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB 3706-2024 石化行業(yè)用不銹鋼閥門鑄件
- T-ZJCX 0047-2024 浙江省法人數(shù)字證書應(yīng)用接口規(guī)范
- 二零二五年度宅基地占用權(quán)轉(zhuǎn)讓協(xié)議
- 獨(dú)立董事聘用合同(二零二五年度)-能源行業(yè)節(jié)能減排
- 2025年度門面買賣合同(含廣告位租賃)
- 二零二五年度音樂作品著作權(quán)許可與網(wǎng)絡(luò)播放協(xié)議
- 2025年度校外住宿生安全管理及意外傷害賠償協(xié)議
- 2025年度相鄰宅基地邊界爭(zhēng)議解決與宅基地置換協(xié)議
- 二零二五年度拆除工程合同糾紛解決機(jī)制合同
- 二零二五年度自然人個(gè)人醫(yī)療設(shè)備貸款合同生效與還款規(guī)定
- 人工智能教育背景下中小學(xué)教師智能教育素養(yǎng)提升路徑研究
- 2024年中級(jí)消防員考試題庫(kù)
- 必考古詩(shī)賞析知識(shí)點(diǎn)(九年級(jí)下冊(cè))-2025年中考語(yǔ)文一輪復(fù)習(xí)
- 2024-2025學(xué)年人教版八年級(jí)物理上學(xué)期課后習(xí)題答案
- 遼寧省沈陽(yáng)市大東區(qū)2024年中考化學(xué)模擬試題一
- 國(guó)能遼寧北票 200MW 風(fēng)力發(fā)電項(xiàng)目地質(zhì)災(zāi)害危險(xiǎn)性評(píng)估報(bào)告
- 江蘇省常州市教育學(xué)會(huì)2023-2024學(xué)年下學(xué)期八年級(jí)數(shù)學(xué)考試卷
- DZ∕T 0214-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 銅、鉛、鋅、銀、鎳、鉬(正式版)
- 2024年瓦斯爆炸事故專項(xiàng)應(yīng)急演練桌面推演腳本
- 2024年遼寧大連中遠(yuǎn)海運(yùn)川崎船舶工程有限公司招聘筆試參考題庫(kù)含答案解析
- 《單層廠房鋼結(jié)構(gòu)》
評(píng)論
0/150
提交評(píng)論