天天看點

VS2010&MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

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。如下圖。

VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

    步驟3:插入新的對話框資源,并用對話框編輯器設計對話框

        設定新的對話框的ID為IID_MYDLG,标題改為“對話框執行個體”

        分别在對話框上添加3個靜态正文控件和3個編輯框控件,

         3個靜态正文控件的Caption屬性分别設為“加數”、“被加數”、“兩數之和”

         3個編輯框控件的ID分别設為IDC_EDIE_NUM1,IDC_EDIT_NUM2,IDC_EDIT_SUM

         将對話框上的“Cancel”屬性改為“相加”

VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

    步驟4:建立新的對話框類,該類應從CDialog派生

    利用ClassWizard建立,這個新類隻有兩個函數,一個構造函數,一個析構函數

VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

    <注意>現在還沒有給這個對話框類添加與控件相關聯的資料成員,還不能進行資料交換

    步驟5 :使用ClassWizard為對話框添加與控件相關聯的成員變量

         勾選“Control variable”複選框,表示此事添加的是控件成員變量,預設選擇的類是CMyDlg(即目前視窗的類),“Contro ID”會顯示控件的ID

         在“control ID”選擇控件ID;在“Variable name”中輸入變量名,m_num1;在“Category”下拉清單選擇Value選項;在“Variable type”中選擇int選項,其餘預設

         可以給這個成員變量一個限定值0-200

VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

    其他的編輯控件也如此設定:

VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立
VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

    步驟6:在對話框類中添加需要處理的消息函數

     打開IDD_MYDLG對話框資源,在“相加”控件右擊選擇“Add Event Handler”指令,選擇Message type ,Class List以及handler name後點選OK

VS2010&amp;MFC對話框程式設計(2)——對話框種類(模态/非模态對話框)1、對話框組成2、對話框分類3、建立對話框的一般步驟4、模态對話框的建立5、非模态對話框的建立

    在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()函數來顯示對話框視窗

繼續閱讀