對話框的組成
對話框主要由兩部分組成。
對話框資源:可以使用對話框編輯器來配置對話框的界面,如對話框的大小、位置、樣式,對話框中控件的類型和位置等。另外,我們還可以在程序的執行過程中動态創建對話框資源。
對話框類:在MFC程序中,可以使用向導幫助用戶建立一個與對話框資源相關聯的類,通常這個類由CDialog類派生。
對話框的類型
對話框可以分為模式對話框和無模式對話框兩種類型。
CDialog
為了能夠方便的操作對話框,MFC為用戶提供了CDialog類。它是在屏幕上顯示對話框的基類,與對話框資源緊密相關,提供了管理對話框的接口,封裝了一些對話框的相關操作。
從CDialog的定義代碼可以看出,Cdialog提供了兩套構建Cdialog對象的系統,分别用于模式對話框和無模式對話框。
無模式對話框對象的構建過程,它首先調用缺省的構造函數生成對話框對象,然後調用Create函數創建和初始化對話框。Cdialog類中的Create函數有兩種函數原型:
BOOLCreate( LPCTSTR lpszTemplateName,CWnd*pParentWnd=NULL);
BOOLCreate(UINT nIDTemplate, CWnd* pParentWnd=NUL ;
其中,
參數lpszTemplateName是無模式對話框模闆資源的标志符;
參數nIDTemplat是對話框模闆資源的标志符,它通常以IDD_開頭(例如IDD_DIALOG1);
參數pParentWnd是指向對話框對象所屬的父窗口的指針(如果它為NULL,則表示對話框對象的父窗口是應用程序主窗口)。如果希望對話框中它的父窗口創建後馬上被顯示,就必須把對話框模闆設置為WS_VISIBLE形式。否則,需要調用ShowWindow函數來顯示對話框。
對于模式對話框,其構造函數如下所示:
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd=NULL );
CDialog( UINT nIDTemplate, CWnd* pParentWnd=NUL );
構造函數的參數說明與無模式對話框的Create函數類似。在模式對話框中,當創建了對話框對象後,可以通過調用DoModal函數來顯示對話框。
一般情況下,無論是模式對話框還是無模式對話框,都有兩個按鈕OK和CANCEL。對話框為它們提供了默認的消息處理函數OnOk和OnCancel。調用這兩個函數都将關閉對話框。所不同的是,默認的OnOk函數中關閉對話框前将更新對話框數據,而默認的OnCancel函數不更新對話框數據。
當CDialog類檢測到OK或Cancel鍵時,它将調用::EndDialog函數。EndDialog函數雖然結束了對話框應用程序,但卻并沒有删除對話框對象,釋放内存。這對于模式對話框來說,不是問題,它的生存時間不長,我們一般在棧上創建它們;但無模式對話框則不同,它的生存時間更長,我們通常在棧上創建它們,并且希望它在消失之前能夠删除自己。因此,大多數情況下,我們需要在無模式對話框中重載OnOK和OnCancel函數,加入DestroyWindows函數來徹底地删除它。
數據交換和驗證機制
在VC中,所有的對話框函數都是使用C++代碼實現的,它并沒有采用特殊的資源或“奇特”的宏,但卻可以很好地實現用戶與應用程序之間的交互工作,這裡的關鍵就在于對話框應用程序中廣泛采用的對話框數據交換和驗證機制。
對話框數據交換(DDX,Dialog Data Exchange)用于初始化對話框中的控件并獲取用戶的數據輸入,而對話框數據驗證(DDV,Dialog Data Validation)則用于驗證對話框中數據輸入的有效性。MFC在每個對話框類中提供了一個用于重載的虛函數——DoDataExchange來實現對話框數據交換和驗證工作。
對話框數據交換
如果使用DDX機制,則通常在OnInitDialog程序或對話框構造函數中設置對話框對象成員變量的初始值。在對話框即将顯示前,應用程序框架的DDX機制将成員變量的值傳遞給對話框的控件,當對話框響應DoModal或Create而被顯示時,對話框控件将“顯示”這些值。Cdialog類中的OnInitDialog函數默認時将調用CWnd類的UpdateData成員函數初始化對話框中的控件。UpdateData函數的原型如下:
BOOL UpdateData( BOOL bSaveAndValidate=TRUE);
函數參數為TRUE,即将對話框及其控件中的數據傳遞給程序代碼中的成員變量;
函數參數為FALSE,即将類中的數據狀态傳遞給對話框及其控件。
當用戶重載DoDataExchange函數時,也就為每一個數據成員(控件)指定了一個DDX函數調用。
對話框數據驗證
除了調用DDX參數指定數據交換外,用戶還可以使用DDV函數進行對話框數據驗證。在調用控件的DDX函數後,必須立即調用該控件的DDV函數。大部分DDV函數的原型如下所示。
DDV_MinMaxCustom(pDX,Data,MinData,MaxData);
其中,參數pDX是一個指向CdataExchange對象的指針,參數Data中存放着即将被驗證的數據,後兩個參數用于定制數據的範圍。
CdataExchange類
如果僅僅需要使用對話框數據,一般沒有必要了解數據交換/驗證的核心内容。但在了解了數據交換和驗證的實質後,用戶就可以編寫自己的數據交換和驗證代碼,定制DDX/DDV.
對話框控件
控件是一個可以與其交互以完成輸入或操作數據操作的對象,它也是一種特殊的窗口。控件通常出現在對話框或工具欄中。Windows提供了多種多樣的控件,在MFC應用程序中,能夠使用的控件通常可以分為三種。
1)windows公用控件:包括編輯控件、按鈕、列表框、組合框、滑動條控件等,另外也包括所有者描述的控件。
2)ActiveX控件:既可以在對話框中使用,也可以在HTML網頁中使用。
3)由MFC提供的其他控件類
我們主要介紹第一種類型的控件——Windows公用控件。
Windows操作系統提供了多種windows公用控件,這些控件對象都是可編程的,VisualC++的對話框編輯器支持将這些控件對象添加到對話框中。用戶可以在工具箱的對話框編輯器中看到這些windows公用控件。MFC為了更好的支持windows公用控件,提供了多種控件類,每一個控件類封裝一種控件,并提供相應的成員函數來管理操作控件。
消息對話框
我們在使用Windows系統的過程中經常會見到消息對話框,提示我們有異常發生或提出詢問等。因為在軟件開發中經常用到消息對話框,所以MFC提供了兩個函數可以直接生成指定風格的消息對話框,而不需要我們在每次使用的時候都要去創建對話框資源和生成對話框類等。這兩個函數就是CWnd類的成員函數MessageBox()和全局函數AfxMessageBox()。
一、CWnd::MessageBox()函數和AfxMessageBox()函數的用法
下面分别講解兩個函數的用法。
1、CWnd::MessageBox()函數
CWnd::MessageBox()的函數原型如下:
intMessageBox(
LPCTSTR lpszText,
LPCTSTR lpszCaption=NULL,
UINT nType = MB_OK
);
參數說明:lpszText:需要顯示的消息字符串。lpszCaption:消息對話框的标題字符串。默認值為NULL。取值為NULL時使用默認标題。nType:消息對話框的風格和屬性。默認為MB_OK風格,即隻有“确定”按鈕。nType的取值可以是下面兩個表中任取一個值,也可以是各取一個值的任意組合。即可以指定一個對話框類型,也可以指定一個對話框圖标,還可以兩者都設定。
對話框類型表:
nType取值參數說明
MB_ABORTRETRY有“終止”、“重試”和“忽略”按鈕
MB_OK有“确定”按鈕
MB_OKCANCEL 有“确定”和“取消”按鈕
MB_RETRYCANCEL有“重試”和“取消”按鈕
MB_YESNO有“是”和“否”按鈕
MB_YESNOCANCEL有“是”、“否”和“取消”按鈕
對話框圖标類型表:
nType
MB_ICONEXCLAMTION
MB_ICONWARNING
MB_ICONASTERISK
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
如果想要設置nType的值為類型和圖标的組合,可以像這樣取值:MB_OKCANCEL|MB_ICONQUESTION。按位取或就可以了。
2、AfxMessageBox()函數
AfxMessageBox()的函數原型為:
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType = MB_OK,
UINT nIDHelp=0
參數說明:lpszText:同CWnd::MessageBox()函數nType:CWnd::MessageBox()函數nIDHelp:此消息的幫助的上下文ID。默認值為0,取0時表示要使用應用程序的默認幫助上下文。
二、CWnd::MessageBox()和AfxMessageBox()的返回值
我們在調用了上面兩個函數後,都可以彈出模态消息對話框。消息對話框關閉後,我們也都可以得到它們的返回值。兩者的返回值就是用戶在消息對話框上單擊的按鈕的ID,可以是以下值:
IDABORT:單擊“終止”按鈕。
IDCANCEL:單擊“取消”按鈕。
IDIGNORE:單擊“忽略”按鈕。
IDNO:單擊“否”按鈕。
IDOK:單擊“确定”按鈕。
IDRETRY:單擊“重試”按鈕。
IDYES:單擊“是”按鈕。



















