什么叫做對(duì)話框?
對(duì)話框 一種次要窗口,包含按鈕和各種選項(xiàng),通過它們可以完成特定命令或任務(wù)。
對(duì)話框與窗口有區(qū)別,它沒有最大化按鈕、沒有最小化按鈕、不能改變形狀大小 對(duì)話框:是人機(jī)交流的一種方式,用戶對(duì)對(duì)話框進(jìn)行設(shè)置,計(jì)算機(jī)就會(huì)執(zhí)行相應(yīng)的命令。
對(duì)話框中有單選框、復(fù)選框等。
對(duì)話框的組成 對(duì)話框主要由兩部分組成。
對(duì)話框資源:可以使用對(duì)話框編輯器來配置對(duì)話框的界面,如對(duì)話框的大小、位置、樣式,對(duì)話框中控件的類型和位置等。
另外,我們還可以在程序的執(zhí)行過程中動(dòng)態(tài)創(chuàng)建對(duì)話框資源。
對(duì)話框類:在MFC程序中,可以使用向?qū)椭脩艚⒁粋€(gè)與對(duì)話框資源相關(guān)聯(lián)的類,通常這個(gè)類由CDialog類派生。
對(duì)話框的類型 對(duì)話框可以分為模式對(duì)話框和無模式對(duì)話框兩種類型。
CDialog 為了能夠方便的操作對(duì)話框,MFC為用戶提供了CDialog類。
它是在屏幕上顯示對(duì)話框的基類,與對(duì)話框資源緊密相關(guān),提供了管理對(duì)話框的接口,封裝了一些對(duì)話框的相關(guān)操作。
從CDialog的定義代碼可以看出,Cdialog提供了兩套構(gòu)建Cdialog對(duì)象的系統(tǒng),分別用于模式對(duì)話框和無模式對(duì)話框。
無模式對(duì)話框?qū)ο蟮臉?gòu)建過程,它首先調(diào)用缺省的構(gòu)造函數(shù)生成對(duì)話框?qū)ο螅缓笳{(diào)用Create函數(shù)創(chuàng)建和初始化對(duì)話框。
Cdialog類中的Create函數(shù)有兩種函數(shù)原型: BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL ); 其中, 參數(shù)lpszTemplateName是無模式對(duì)話框模板資源的標(biāo)志符; 參數(shù)nIDTemplat是對(duì)話框模板資源的標(biāo)志符,它通常以IDD_開頭(例如IDD_DIALOG1); 參數(shù)pParentWnd是指向?qū)υ捒驅(qū)ο笏鶎俚母复翱诘闹羔槪ㄈ绻鼮镹ULL,則表示對(duì)話框?qū)ο蟮母复翱谑菓?yīng)用程序主窗口)。
如果希望對(duì)話框中它的父窗口創(chuàng)建后馬上被顯示,就必須把對(duì)話框模板設(shè)置為WS_VISIBLE形式。
否則,需要調(diào)用ShowWindow函數(shù)來顯示對(duì)話框。
對(duì)于模式對(duì)話框,其構(gòu)造函數(shù)如下所示: CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL ); 構(gòu)造函數(shù)的參數(shù)說明與無模式對(duì)話框的Create函數(shù)類似。
在模式對(duì)話框中,當(dāng)創(chuàng)建了對(duì)話框?qū)ο蠛螅梢酝ㄟ^調(diào)用DoModal函數(shù)來顯示對(duì)話框。
一般情況下,無論是模式對(duì)話框還是無模式對(duì)話框,都有兩個(gè)按鈕OK和CANCEL。
對(duì)話框?yàn)樗鼈兲峁┝四J(rèn)的消息處理函數(shù)OnOk和OnCancel。
調(diào)用這兩個(gè)函數(shù)都將關(guān)閉對(duì)話框。
所不同的是,默認(rèn)的OnOk函數(shù)中關(guān)閉對(duì)話框前將更新對(duì)話框數(shù)據(jù),而默認(rèn)的OnCancel函數(shù)不更新對(duì)話框數(shù)據(jù)。
當(dāng)CDialog類檢測到OK或Cancel鍵時(shí),它將調(diào)用::EndDialog函數(shù)。
EndDialog函數(shù)雖然結(jié)束了對(duì)話框應(yīng)用程序,但卻并沒有刪除對(duì)話框?qū)ο螅尫艃?nèi)存。
這對(duì)于模式對(duì)話框來說,不是問題,它的生存時(shí)間不長,我們一般在棧上創(chuàng)建它們;但無模式對(duì)話框則不同,它的生存時(shí)間更長,我們通常在棧上創(chuàng)建它們,并且希望它在消失之前能夠刪除自己。
因此,大多數(shù)情況下,我們需要在無模式對(duì)話框中重載OnOK和OnCancel函數(shù),加入DestroyWindows函數(shù)來徹底地刪除它。
對(duì)話框數(shù)據(jù)交換和驗(yàn)證機(jī)制 在VC中,所有的對(duì)話框函數(shù)都是使用C++代碼實(shí)現(xiàn)的,它并沒有采用特殊的資源或“奇特”的宏,但卻可以很好地實(shí)現(xiàn)用戶與應(yīng)用程序之間的交互工作,這里的關(guān)鍵就在于對(duì)話框應(yīng)用程序中廣泛采用的對(duì)話框數(shù)據(jù)交換和驗(yàn)證機(jī)制。
對(duì)話框數(shù)據(jù)交換(DDX,Dialog Data Exchange)用于初始化對(duì)話框中的控件并獲取用戶的數(shù)據(jù)輸入,而對(duì)話框數(shù)據(jù)驗(yàn)證(DDV,Dialog Data Validation)則用于驗(yàn)證對(duì)話框中數(shù)據(jù)輸入的有效性。
MFC在每個(gè)對(duì)話框類中提供了一個(gè)用于重載的虛函數(shù)——DoDataExchange來實(shí)現(xiàn)對(duì)話框數(shù)據(jù)交換和驗(yàn)證工作。
對(duì)話框數(shù)據(jù)交換 如果使用DDX機(jī)制,則通常在OnInitDialog程序或?qū)υ捒驑?gòu)造函數(shù)中設(shè)置對(duì)話框?qū)ο蟪蓡T變量的初始值。
在對(duì)話框即將顯示前,應(yīng)用程序框架的DDX機(jī)制將成員變量的值傳遞給對(duì)話框的控件,當(dāng)對(duì)話框響應(yīng)DoModal或Create而被顯示時(shí),對(duì)話框控件將“顯示”這些值。
Cdialog類中的OnInitDialog函數(shù)默認(rèn)時(shí)將調(diào)用CWnd類的UpdateData成員函數(shù)初始化對(duì)話框中的控件。
UpdateData函數(shù)的原型如下: BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 函數(shù)參數(shù)為TRUE,即將對(duì)話框及其控件中的數(shù)據(jù)傳遞給程序代碼中的成員變量; 函數(shù)參數(shù)為FALSE,即將類中的數(shù)據(jù)狀態(tài)傳遞給對(duì)話框及其控件。
當(dāng)用戶重載DoDataExchange函數(shù)時(shí),也就為每一個(gè)數(shù)據(jù)成員(控件)指定了一個(gè)DDX函數(shù)調(diào)用。
對(duì)話框數(shù)據(jù)驗(yàn)證 除了調(diào)用DDX參數(shù)指定數(shù)據(jù)交換外,用戶還可以使用DDV函數(shù)進(jìn)行對(duì)話框數(shù)據(jù)驗(yàn)證。
在調(diào)用控件的DDX函數(shù)后,必須立即調(diào)用該控件的DDV函數(shù)。
大部分DDV函數(shù)的原型如下所示。
DDV_MinMaxCustom(pDX, Data, MinData, MaxData); 其中,參數(shù)pDX是一個(gè)指向CdataExchange對(duì)象的指針,參數(shù)Data中存放著即將被驗(yàn)證的數(shù)據(jù),后兩個(gè)參數(shù)用于定制數(shù)據(jù)的范圍。
CdataExchange類 如果僅僅需要使用對(duì)話框數(shù)據(jù),一般沒有必要了解數(shù)據(jù)交換/驗(yàn)證的核心內(nèi)容。
但在了解了數(shù)據(jù)交換和驗(yàn)證的實(shí)質(zhì)后,用戶就可以編寫自己的數(shù)據(jù)交換和驗(yàn)證代碼,定制DDX/DDV. 對(duì)話框控件 控件是一個(gè)可以與其交互以完成輸入或操作數(shù)據(jù)操作的對(duì)象,它也是一種特殊的窗口。
控件通常出現(xiàn)在對(duì)話框或工具欄中。
Windows提供了多種多樣的控件,在MFC應(yīng)用程序中,能夠使用的控件通常可以分為三種。
1)windows公用控件:包括編輯控件、按鈕、列表框、組合框、滑動(dòng)條控件等,另外也包括所有者描述的控件。
2)ActiveX控件:既可以在對(duì)話框中使用,也可以在HTML網(wǎng)頁中使用。
3)由MFC提供的其他控件類 我們主要介紹第一種類型的控件——Windows公用控件。
Windows操作系統(tǒng)提供了多種windows公用控件,這些控件對(duì)象都是可編程的,Visual C++的對(duì)話框編輯器支持將這些控件對(duì)象添加到對(duì)話框中。
用戶可以在工具箱的對(duì)話框編輯器中看到這些windows公用控件。
MFC為了更好的支持windows公用控件,提供了多種控件類,每一個(gè)控件類封裝一種控件,并提供相應(yīng)的成員函數(shù)來管理操作控件。