C++ MFC深入詳解之----模態對話框與非模態對話框

對話框的種類


有兩種類型的對話框:模態( Modal)對話框和非模態( Modeless)對話框

  • 模態對話框

模態對話框是指當其顯示時,程序會暫停執行,直到關閉這個模態對話框後,才能繼續執行程序中其他任務。例如,在Word中利用【文件打開】菜單命令顯示一個“打開”對話框後,再用鼠標去選擇其他菜單,或者進行該對話框以外的任何操作時,只會聽到嘟嘟聲,這是因爲“打開”對話框是一個模態對話框。模態對話框壟斷了用戶的輸入,當模態對話框打開時,用戶只能與該對話框進行交互,而其他用戶界面對象接收不到輸入信息。我們平時所遇到的大部分對話框都是模態對話框。

 

  • 非模態對話框

當非模態對話框顯示時,允許轉而執行程序中其他任務,而不用關閉這個對話框。典型的例子是 Windows提供的記事本程序中的“查找”對話框,該對話框不會壟斷用戶的輸入,打開“査找”對話框後,仍可以與其他用戶界面對象進行交互,用戶可以一邊查找,一邊修改文章,這樣,就大大方便了使用

總結:簡單說就是模態對話框顯示時不能進行其他操作,而非模態對話框顯示時可以對其他界面進行操作

創建:

首先插入一個對話框:如圖所示點擊插入(Insert),再點擊資源(Resource),選擇Dialog,或者在資源視圖右擊點擊插入(Insert Dialog)

 

在MFC中,對資源的操作通常都是通過一個與資源相芙的類來完成的。對話框資源也有一個相應的基類: CDialog.

根據MSDN提供的幫助信息,可以知道 CDialog類派生於CWnd類,所以它是一個與窗口相關的類,主要用來在屏幕上顯示一個對話框。由此可知,實際上,對話框本身也是一個窗口界面。既然在MFC中,對資源的操作是通過一個類來完成的,那麼就需要創建一個類與這個新建的對話框資源相關聯。爲此,在ⅤC++開發環境中,選擇【view】菜單下的【 Class Wizard】菜單命令,這時會彈出對話框,提示ID: IDD DIALOG1資源是一個新資源,並且因爲它是一個對話框資源,所以需要爲它創建一個相關聯的類,或者可以選擇程序中已有的一個類與之相關聯。單擊【OK】按鈕,然後彈出一個對話框利用這個對話框就可以爲新建的對話框資源創建一個關聯的類,,然後取一個名字,例:CTestDlg.

如何調用與顯示對話框:

對於模態對話框:      例:點擊按鈕彈出一個模態對話框

首先拖入按鈕控件,雙擊按鈕,添加響應函數,在函數中敲下如下代碼(在這之前要先添加對應對話框類的頭文件TestDlg.h)

void CTestDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	CTestDlg dlg;
	dlg.DoModal();
}

編譯運行:   點擊Button1按鈕,顯示爲圖二

      

 

在創建模態對話框時,當執行到調用 DoModal函數以顯示這個對話框時,程序就會暫停執行,直到模態對話框關閉之後,程序才繼續向下執行。也就是說,當模態對話框顯示時,程序中創建的dlg這個對象的生命週期並未結束。因此,在創建非模態對話框時,不能把對話框對象定義爲局部對象。對於這個問題,有兩種解決辦法:一種就是把這個對話框對象定義爲類的成員變量;另一種方式是將它定義爲指針,在堆上分配內存。我們知道,在堆上分配的內存,與程序的整個生命週期是一致的,當然這裏是指程序中不主動銷燬的情況這裏,我們採用後一種方式

對於非模態對話框:     例:點擊按鈕彈出一個非模態對話框

void CModleDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
//	CTestDlg dlg;
//	dlg.DoModal();
	CTestDlg* pDlg = new CTestDlg;
	pDlg->Create(IDD_DIALOG1,this);    //創建對話框
	pDlg->ShowWindow(SW_SHOW);    //顯示對話框
}

 

可是,上例所示的這段程序仍有問題,首先,我們定義的pDlg這個指針變量是個局部對象,這樣當它的生命週期結束時,它所保存的內存地址就丟失了,那麼在程序中也就無法再引用到它所指向的那塊內存了。這個問題的解決辦法有兩種:一是將這個指針變量定義爲類的成員變量,然後在 CMybole View類的析構函數中調用 delete函數來釋放這個指針變量所指向的那塊內存;二是在 CTestDlg類中重載PostNcDestroy虛函數,釋放this指針所指向的內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章