發(fā)表于2013/12/26 16:29:07 311人閱讀
分類: MFC
1、創(chuàng)建方法不同。模態(tài)對話框一般通過聲明對話框類對象,然后,直接調(diào)用DoModal即可創(chuàng)建成功;而非模態(tài)對話框一般通過Create函數(shù)創(chuàng)建。
2、銷毀方法不同。當(dāng)模態(tài)對話框創(chuàng)建函數(shù)DoModal返回時,對話框自動銷毀;而銷毀非態(tài)對話框時則要人工干預(yù),一般調(diào)用函數(shù)DestroyWindow。
3、對“確定”、“取消”按鈕的響應(yīng)不同。對于模態(tài)對話框,則直接重載基類的版本即可,并且要求在重載的版本中調(diào)用基類的實現(xiàn);而對于非模態(tài)對話框,則不可以調(diào)用基類的實現(xiàn),因為基類的版本將調(diào)用EndDialog,而此函數(shù)只適用于模態(tài)對話框。
4、消息的處理途徑不同。模態(tài)對話框有自己的消息循環(huán),而非模態(tài)對話框的消息要經(jīng)過應(yīng)用的消息隊列。如果想把這些消息傳送給對話框窗口過程,則必須更改消息隊列。
5、對于默認(rèn)的對話框模板,其Visible 屬性默認(rèn)為空,這不會對創(chuàng)建模態(tài)對話框產(chǎn)生任何影響,因為在消息循環(huán)中將會對此作出處理,從而創(chuàng)建完畢后即是可見的;而對于非模態(tài)對話框,就有所不同,如果沒有選中Visible 的話,則創(chuàng)建對話框后,必須調(diào)用ShowWindow 以便確保對話框可見。
二、對話框數(shù)據(jù)交換和驗證1、CDataExchange類簡介
CDataExchange類提供了用于進(jìn)行DDX和DDV所必需的上下文信息。當(dāng)m_bSaveAndValidate為FALSE時,DDX將使用對話框數(shù)據(jù)成員值填充對話框控件的初始值;而當(dāng)其為TRUE時,DDX將會把控件的當(dāng)前值置入成員變量,并用DDV驗證此值是否符合所設(shè)定的標(biāo)準(zhǔn)。如果DDV失敗,那么DDV過程將會彈出一個用于解釋輸入錯誤的對話框。接著,DDV過程將會調(diào)用Fail,把焦點設(shè)置為產(chǎn)生錯誤的控件,并拋出異常以終止驗證過程。
CDataExchange類共有2個成員變量以及3個成員函數(shù):
1)m_bSaveAndValidate:用于DDX和DDV方向的標(biāo)志。
2)m_pDlgWnd:發(fā)生數(shù)據(jù)交換的對話框或者窗口(任何從CWnd 類派生的均可以進(jìn)行數(shù)據(jù)交換)。
3)PrepareCtrl以及PrepareEditCtrl:準(zhǔn)備用于數(shù)據(jù)交換的對話框控件。它存儲控件的句柄以便當(dāng)驗證失敗時設(shè)置控件的輸入焦點。
前者用于非編輯控件,后者用于編輯控件。
4)Fail:驗證失敗時調(diào)用。恢復(fù)前一個控件的輸入焦點并且拋出異常。
2、數(shù)據(jù)交換和驗證
如果使用DDX機(jī)制,通常在OnInitDialog函數(shù)或者對話框構(gòu)造函數(shù)中,設(shè)置對話框?qū)ο蟮某蓡T變量值。在對話框?qū)⒁@示的前一刻,
框架的DDX機(jī)制立即將成員變量值傳輸?shù)綄υ捒虻目丶?,而?dāng)用DoModal或者Create創(chuàng)建對話框并顯示時,即可看到那些控件值。
對話框成員函數(shù)OnInitDialog缺省實現(xiàn)是:調(diào)用CWnd 的成員函數(shù)UpdateData 以初始化對話框的控件。
當(dāng)用戶單擊了“確定”按鈕時,或者在任何時候以參數(shù)TRUE調(diào)用UpdateData時,DDX機(jī)制就會把數(shù)據(jù)從控件傳輸?shù)匠蓡T變量中。
此時,DDV機(jī)制按照事先指定的驗證規(guī)則對傳輸?shù)臄?shù)據(jù)進(jìn)行驗證。
A.數(shù)據(jù)更新——UpdateData
當(dāng)按下“確定”按鈕時,用戶的輸入變量將會傳輸?shù)娇丶鶎?yīng)的變量中,而且DoModal返回IDOK。在DoModal中調(diào)用函數(shù)CreateDlgIndirect創(chuàng)建對話時,產(chǎn)生了WM_INITDIALOG消息,從而引起對函數(shù)CDialog::OnInitDialog的調(diào)用,在初始化對話框資源后,立即就調(diào)用了函數(shù)UpdateData,此函數(shù)正是開始數(shù)據(jù)交換的起點。它是CWnd類的成員函數(shù),其定義如下:
它首先以傳進(jìn)來的bSaveAndValidate值為參數(shù)構(gòu)造CDataExchange對象,然后調(diào)用CWnd的虛擬成員函數(shù)DoDataExchange,此函數(shù)為空,而且它什么也不做,而對話框類CModalDlg已經(jīng)重載了此函數(shù),接下來對它進(jìn)行介紹。
B.數(shù)據(jù)交換——DoDataExchange
下面是DoDataExchange函數(shù)的具體實現(xiàn):
它首先調(diào)用基類的版本,而基類版本的實現(xiàn)為空,所以不需要理它。然后調(diào)用了DDX_Text,此函數(shù)用于管理對話框、表單視以及控件視中的編輯控件與int、UINT、long、DWORD、CString、float 或者double數(shù)據(jù)類型之間的傳輸,或者管理對話框、表單視以及控件視中的CString數(shù)據(jù)成員之間的數(shù)據(jù)傳輸?shù)?。它的具體定義如下:此函數(shù)有三個參數(shù),其含義分別如下。
1)參數(shù)pDX:該參數(shù)表示CDataExchange對象的指針。
2)參數(shù)nIDC:該參數(shù)表示編輯控件的ID值。
3)參數(shù)value:對話框數(shù)據(jù)成員的引用,其類型取決于用戶使用的DDX_Text版本,這里為CString類型。
DDX_Text 主要根據(jù)m_bSaveAndValidate的值決定控件和成員變量交換數(shù)據(jù)的方向。
當(dāng)m_bSaveAndValidate為FALSE中,則將從對話框成員變量向?qū)υ捒蚩丶鬏敂?shù)據(jù),即調(diào)用函數(shù)AfxSetWindowText,其定義如下:
C.數(shù)據(jù)驗證
在為控件IDC_TITTLE添加成員變量時,指定了允許輸入的最大字符數(shù),因此,當(dāng)m_bSaveAndValidate為TRUE時,DoDataExchange還將調(diào)用函數(shù)DDV_MaxChars,它的定義如下:
此函數(shù)的3 個參數(shù)含義如下。
1)參數(shù)pDX:該參數(shù)表示CDataExchange對象的指針。
2)參數(shù)value:對話框等數(shù)據(jù)成員的引用,也是此函數(shù)進(jìn)行驗證的對象。
3)參數(shù)nChars:該參數(shù)表示編輯控件所能接受的最大字符數(shù)目。
此函數(shù)主要根據(jù)參數(shù)nChars對參數(shù)value進(jìn)行驗證。
三、通用對話框
除了CDialog類之外,MFC還提供了幾個派生于CDialog的類,它們主要用來封裝一些通用的對話框,如:“顏色選擇”、“字體選擇”以及“打開文件”等。它們是Windows通用對話框庫(庫為COMMDLG.DLL,頭文件為COMMDLG.H)的一部分。
1)CColorDialog:允許用戶選擇或者創(chuàng)建顏色。
2)CFileDialog:允許用戶打開或者保存一個文件。
3)CFindReplaceDialog:允許用戶將一個字符串替換為另一個字符串。
4)CFontDialog:允許用戶選擇字體。
5)CPrintDialog:允許用戶設(shè)置打印信息。
6)CPageSetupDialog:允許用戶設(shè)置頁面參數(shù)。