MFC 非模態對話框

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

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

        在程序運行的過程中,若出現了模態對話框,那麼主窗口將無法發送消息,直到模態對話框退出纔可以發送。

       點擊模態對話框中的OK按鈕,模態對話框會被銷燬。

        創建一個模態對話框的代碼:

[cpp] view plaincopy

  1. //創建一個模態對話框  

  2. CTestDialog td;  

  3. td.DoModal();   

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

        可以創建一個佈局模態對話框類變量,不用擔心它會隨着所在函數返回而被銷燬。因爲DoModal()函數的一個功能是,當前只能運行此模態對話框,且停止主窗口的運行,直到模態對話框退出,才允許主窗口運行。

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

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

        在程序運行的過程中,若出現了非模態對話框,主窗口還可以發送消息。

        點擊非模態對話框中的OK按鈕,非模態對話框沒有銷燬,只是隱藏了。若想點擊OK按鈕時,非模態對話框也銷燬,那麼CTestDialog類必須重載其基類CDialog的虛函數OnOK(),在此函數裏調用DestroyWindow()來銷燬此對話框。

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

[cpp] view plaincopy

  1.           CTestDialog td;  

  2. td.Create(IDD_DIALOG1); //創建一個非模態對話框  

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

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

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

(1)採用局部變量創建一個非模態對話框

[cpp] view plaincopy

  1. //採用局部變量創建一個非模態對話框  

  2. CTestDialog *pTD = new CTestDialog();  

  3. pTD->Create(IDD_DIALOG1); //創建一個非模態對話框  

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

       因爲指針在聲明的時候是被放在堆棧中,只有整個應用程序關閉後纔會被銷燬,所以可以正常顯示對話框。

        這種方法雖然不影響程序的運行,可是指針pTD所指向的內存卻導致不可用,這樣的編程很不好。

(2)採用成員變量創建一個非模態對話框

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

[cpp] view plaincopy

  1. private:  

  2.     CTestDialog *pTD;  

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

[cpp] view plaincopy

  1. //採用成員變量創建一個非模態對話框  

  2. pTD = new CTestDialog(); //給指針分配內存  

  3. pTD->Create(IDD_DIALOG1); //創建一個非模態對話框  

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

        最後在所在類的析構函數中收回pTD所指向的內存:

[cpp] view plaincopy

  1. delete pTD;  


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