1、對話框組成
從MFC角度看,分為兩類:
(1)對話框模闆資源。對話框模闆用于指定對話框的控件及其分布,Windows根據對話框模闆來建立并顯示對話框
(2)對話框類。用于實作對話框的功能,一般從CDialog類、CpropertySheet類、CpropertyPage類派生新類,完成特定的功能。
2、對話框分類
對話框分為模态(Model)對話框和非模态(Modeless)對話框
2.1、模态對話框
是指這種對話框顯示時,其父視窗将失效,隻有處理完對話框要求的動作,才會将控制權交換給父視窗。
<視窗風格>
雖然可賦予對話框任何風格,但是Windows建議y用DS_MODALFRAME(使得模态對話框具有厚邊)、WS_CAPTION及WS_SYSMENU。
<注意>
螢幕上顯示模态對話框時,它擁有自己的消息循環,是以,所有的輸入視窗資訊都不能指定為WS_CHILD風格,否則父視窗将失效,子視窗(對話框自己)也會随之失效。
2.2、非模态對話框
又稱共享式對話框,在打開非模态對話框時,依然可以對其他視窗進行操作。
<視窗風格>
大部分都指定WS_POPUP、WS_CAPTION、WS_BORDER、及WS_SYSTEMMENU風格。典型的都包括系統菜單和标題。
<注意>
(1)非模态對話框從主程式的消息循環中獲得輸入消息。如果非模态對話框中有控件存在,而且允許使用者用鍵盤去選擇,就必須在消息循環中調用CWnd類(或其繼承類)的成員函數IsDialogMessage()來判斷輸入消息是否要送給非模态對話框,若是,就處理它,否則就按百折不回的途徑處理它。
(2)非模态對話框的建立靠CDialog類的成員函數Create()來完成,關閉則用CWnd類的成員函數DestroyWindow()來實作。
3、建立對話框的一般步驟
(1)添加一個新的對話框資源并用對話框編輯器設計對話框(修改ID等屬性)
(2)建立新的對話框類,該類應從CDialog類中派生
(3)使用ClassWizard為對話框類加入與控件相關聯的成員變量
(4)在對話框類中添加需要的消息處理函數
(5)建立并顯示對話框
4、模态對話框的建立
步驟
步驟1:建立MFC單文檔應用程式,工程名為DIalog
步驟2:在生成标準菜單後main添加一個彈出式菜單“Dialog”,下面有兩個菜單指令分别為“Model Dialog”和"Modeless Dialog",它們的ID分别為IDM_MODEDLG和IDM_MODELESSDLG,并在CMainFrame類中添加這兩個菜單指令的COMMAND消息處理函數,分别OnModeldlg和OnModelessdlg。如下圖。

步驟3:插入新的對話框資源,并用對話框編輯器設計對話框
設定新的對話框的ID為IID_MYDLG,标題改為“對話框執行個體”
分别在對話框上添加3個靜态正文控件和3個編輯框控件,
3個靜态正文控件的Caption屬性分别設為“加數”、“被加數”、“兩數之和”
3個編輯框控件的ID分别設為IDC_EDIE_NUM1,IDC_EDIT_NUM2,IDC_EDIT_SUM
将對話框上的“Cancel”屬性改為“相加”
步驟4:建立新的對話框類,該類應從CDialog派生
利用ClassWizard建立,這個新類隻有兩個函數,一個構造函數,一個析構函數
<注意>現在還沒有給這個對話框類添加與控件相關聯的資料成員,還不能進行資料交換
步驟5 :使用ClassWizard為對話框添加與控件相關聯的成員變量
勾選“Control variable”複選框,表示此事添加的是控件成員變量,預設選擇的類是CMyDlg(即目前視窗的類),“Contro ID”會顯示控件的ID
在“control ID”選擇控件ID;在“Variable name”中輸入變量名,m_num1;在“Category”下拉清單選擇Value選項;在“Variable type”中選擇int選項,其餘預設
可以給這個成員變量一個限定值0-200
其他的編輯控件也如此設定:
步驟6:在對話框類中添加需要處理的消息函數
打開IDD_MYDLG對話框資源,在“相加”控件右擊選擇“Add Event Handler”指令,選擇Message type ,Class List以及handler name後點選OK
在CMainFrame.cpp檔案中添加代碼:
void CMainFrame::OnModeldlg()
{
// TODO: 在此添加指令處理程式代碼
CMyDlg m_mydlg;
m_mydlg.DoModal();
}
<說明>
DoModal()負責建立和撤銷摩天對話框。在建立對話框時,DoModal()的任務包括載入對話框模闆資源、調用OnInitDialog()初始化對話框和将對話框顯示出來。完成對話框的建立後,DoModal()啟動一個消息循環,以響應使用者的輸入。由于該消息循環截獲了幾乎所有的輸入消息,是的主循環收不到對話框的輸入,是的使用者隻能和模态對話框進行互動,而其他使用者界面對象收不到輸入資訊。
5、非模态對話框的建立
<說明>
非模态對話框必須定義為全局變量或用new操作符産生一個。
步驟
步驟1:構造一個對話框類的對象,兩種方法 方法1:在 架構視窗類的頭檔案中聲明一個對話框的對象成員變量,如下:
// MainFrm.h : CMainFrame 類的接口
//
........
#include "MyDlg.h"
class CMainFrame : public CFrameWnd
{
.........................
//建立非模态對話框的變量
public:
CMyDlg m_mydlgless;
...................
};
<注意> 這裡聲明的CMyDlg類的 對象,是以還要在架構視窗類的頭檔案中加入語句#include “MyDlg.h”,将對話框的頭檔案包含進來,否則會報錯
方法2:是在架構視窗類中聲明一個對話框類的指針變量,然後使用new操作符動态建立。 例如CMyDlg* pMyDlg = new CMyDlg;不過最後要使用delete才操作符将其釋放。
步驟2:調用CDialog::Create()函數來建立對話框視窗,相應的添加事件響應函數中實作(本例在CMainFrm.cpp)
void CMainFrame::OnModelessdlg()
{
// TODO: 在此添加指令處理程式代碼
if(!m_mydlgless.m_hWnd)
{
m_mydlgless.Create(IDD_MYDLG);
}
m_mydlgless.ShowWindow(SW_SHOW);
}
步驟3:調用CWnd::ShowWindow()函數來顯示對話框視窗