MFC中對話方塊有兩種形式,一個是模態對話方塊(model dialog box),一個是非模態對話方塊(modeless dialog box)。
一、模態對話方塊(model dialog box)
在程式啟動並執行過程中,若出現了模態對話方塊,那麼主視窗將無法發送訊息,直到模態對話方塊退出才可以發送。
點擊模態對話方塊中的OK按鈕,模態對話方塊會被銷毀。
建立一個模態對話方塊的代碼:
//建立一個模態對話方塊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->Create(IDD_DIALOG1); //建立一個非模態對話方塊pTD->ShowWindow(SW_SHOWNORMAL); //顯示非模態對話方塊
最後在所在類的解構函式中收回pTD所指向的記憶體:
delete pTD;