對話框的組成
對話框主要由兩部分組成。對話框資源:可以使用對話框編輯器來配置對話框的界面,如對話框的大小、位置、樣式,對話框中控制項的類型和位置等。另外,我們還可以在程式的執行過程中動態創建對話框資源。
對話框類:在MFC程式中,可以使用嚮導幫助用戶建立一個與對話框資源相關聯的類,通常這個類由CDialog類派生。
對話框的類型
對話框可以分為模式對話框和無模式對話框兩種類型。CDialog
為了能夠方便的操作對話框,MFC為用戶提供了CDialog類。它是在螢幕上顯示對話框的基類,與對話框資源緊密相關,提供了管理對話框的接口,封裝了一些對話框的相關操作。
從CDialog的定義代碼可以看出,Cdialog提供了兩套構建Cdialog對象的系統,分別用於模式對話框和無模式對話框。
無模式對話框對象的構建過程,它首先調用預設的構造函式生成對話框對象,然後調用Create函式創建和初始化對話框。Cdialog類中的Create函式有兩種函式原型:
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
其中,
參數lpszTemplateName是無模式對話框模板資源的標誌符;
參數nIDTemplat是對話框模板資源的標誌符,它通常以IDD_開頭(例如IDD_DIALOG1);
參數pParentWnd是指向對話框對象所屬的父視窗的指針(如果它為NULL,則表示對話框對象的父視窗是應用程式主視窗)。如果希望對話框中它的父視窗創建後馬上被顯示,就必須把對話框模板設定為WS_VISIBLE形式。否則,需要調用ShowWindow函式來顯示對話框。
對於模式對話框,其構造函式如下所示:
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
構造函式的參數說明與無模式對話框的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公用控制項,這些控制項對象都是可程式的,Visual C++的對話框編輯器支持將這些控制項對象添加到對話框中。用戶可以在工具箱的對話框編輯器中看到這些windows公用控制項。MFC為了更好的支持windows公用控制項,提供了多種控制項類,每一個控制項類封裝一種控制項,並提供相應的成員函式來管理操作控制項。
訊息對話框
我們在使用Windows系統的過程中經常會見到訊息對話框,提示我們有異常發生或提出詢問等。因為在軟體開發中經常用到訊息對話框,所以MFC提供了兩個函式可以直接生成指定風格的訊息對話框,而不需要我們在每次使用的時候都要去創建對話框資源和生成對話框類等。這兩個函式就是CWnd類的成員函式MessageBox()和全局函式AfxMessageBox()。一、CWnd::MessageBox()函式和AfxMessageBox()函式的用法
下面分別講解兩個函式的用法。
1、CWnd::MessageBox()函式
CWnd::MessageBox()的函式原型如下:
int MessageBox(
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:單擊“是”按鈕。