天天看點

MFC模态和非模态對話框程式設計

2013-08-30 12:35 狂師  閱讀(342)  評論(0) 編輯 收藏    

   MFC中對話框有兩種形式,一個是模态對話框(model dialog box),一個是非模态對話框(modeless dialog box)。

 一、模态對話框(model dialog box)

        在程式運作的過程中,若出現了模态對話框,那麼主視窗将無法發送消息,直到模态對話框退出才可以發送。

       點選模态對話框中的OK按鈕,模态對話框會被銷毀。

        建立一個模态對話框的代碼:

[cpp] view plaincopyprint?

//建立一個模态對話框   

CTestDialog td;  

td.DoModal();   

        其中CTestDialog為我自己所建立和一個對話框資源相關聯的對話框類。

        可以建立一個布局模态對話框類變量,不用擔心它會随着所在函數傳回而被銷毀。因為DoModal()函數的一個功能是,目前隻能運作此模态對話框,且停止主視窗的運作,直到模态對話框退出,才允許主視窗運作。

        DoModal()函數也有顯示對話框的功能,是以也無需調用其他函數來顯示對話框。

二、非模态對話框(modaless dialog box)

        在程式運作的過程中,若出現了非模态對話框,主視窗還可以發送消息。

        點選非模态對話框中的OK按鈕,非模态對話框沒有銷毀,隻是隐藏了。若想點選OK按鈕時,非模态對話框也銷毀,那麼CTestDialog類必須重載其基類CDialog的虛函數OnOK(),在此函數裡調用DestroyWindow()來銷毀此對話框。

        若和上面一樣的方式建立一個非模态對話框:

          CTestDialog td;  

td.Create(IDD_DIALOG1); //建立一個非模态對話框   

td.ShowWindow(SW_SHOWNORMAL); //顯示非模态對話框  

        那麼,在運作時,你會發現此對話框無法顯示。這是因為你聲明的對話框變量td是局部變量,但這個函數傳回時,td也被析構了,是以無法顯示此對話框。

        建立非模态對話框,必須聲明一個指向CTestDialog類的指針變量,且需要顯示的調用ShowWindow()才能将對話框顯示出來。有兩種建立方法:

(1)采用局部變量建立一個非模态對話框

//采用局部變量建立一個非模态對話框   

CTestDialog *pTD = new CTestDialog();  

pTD->Create(IDD_DIALOG1); //建立一個非模态對話框   

pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模态對話框  

       因為指針在聲明的時候是被放在堆棧中,隻有整個應用程式關閉後才會被銷毀,是以可以正常顯示對話框。

        這種方法雖然不影響程式的運作,可是指針pTD所指向的記憶體卻導緻不可用,這樣的程式設計很不好。

(2)采用成員變量建立一個非模态對話框

        首先在你所要編寫的類的頭檔案中聲明一個指針變量:

private:  

    CTestDialog *pTD;  

        然後再在相應的CPP檔案,在你要建立對話框的位置添加如下代碼:

//采用成員變量建立一個非模态對話框   

pTD = new CTestDialog(); //給指針配置設定記憶體   

        最後在所在類的析構函數中收回pTD所指向的記憶體:

[cpp] delete pTD;  

分類            MFC