使用有模式對話方塊時在對話方塊彈出後呼叫函式不會立即返回,而是等到對話方塊銷毀後才會返回(請注意在對話方塊彈出後其他視窗的訊息依然會被傳遞)。所以在使用對話方塊時其他視窗都不能接收使用者輸入。建立有模式對話方塊的方法是呼叫cdialog::domodal()。下面的**演示了這種用法:
cyourview::onopendlg()
cdialog::domodal()的返回值為idok,idcancel。表明操作者在對話方塊上選擇「確認」或是「取消」。由於在對話方塊銷毀前domodal不會返回,所以可以使用區域性變數來引用物件。在退出函式體後物件同時也會被銷毀。而對於無模式對話方塊則不能這樣使用,下節5.3 建立無模式對話方塊中會詳細講解。
你需要根據domodal()的返回值來決定你下一步的動作,而得到返回值也是使用有模式對話方塊的乙個很大原因。
使用有模式對話方塊需要注意一些問題,比如說不要在一些反覆出現的事件處理過程中生成有模式對話方塊,比如說在定時器中產生有模式對話方塊,因為在上乙個對話方塊還未退出時,定時器訊息又會引起下乙個對話方塊的彈出。
同樣的在你的對話方塊類中為了向呼叫者返回不同的值可以呼叫cdialog::onok()或是cdialog::oncancel()以返回idok或idcancel,如果你希望返回其他的值,你需要呼叫 cdialog::enddialog( int nresult );其中nresult會作為domodal()呼叫的返回值。
下面的**演示了如何使用自己的函式來退出對話方塊:
void cmy52_s1view::onlbuttondown(uint nflags, cpoint point) //過載onok,oncancel void ctestdlg::onok() void ctestdlg::oncancel() //在對話方塊中對三個按鈕訊息進行對映 void ctestdlg::onexit1() void ctestdlg::onexit2() void ctestdlg::onexit3()
由於過載了onok和oncancel所以在對話方塊中按下enter鍵或escape鍵時都不會退出,只有按下三個按鈕中的其中乙個才會返回。
此外在對話方塊被生成是會自動呼叫bool cdialog::oninitdialog(),你如果需要在對話方塊顯示前對其中的控制項進行初始化,你需要過載這個函式,並在其中填入相關的初始化**。利用classwizard可以方便的產生一些預設**,首先開啟classwizard,選擇相應的對話方塊類,在右邊的訊息列表中選擇wm_initdialog並雙擊,如圖,classwizard會自動產生相關**,**如下:
bool ctestdlg::oninitdialog()
MFC 建立模式對話方塊與非模式對話方塊
模式對話方塊 my about cb cb.domodal 非模式對話方塊 my about cb new my about cb create idd myabout,this cb showwindow sw show vc2008 mfc 預設新增到對話方塊會有 確定跟取消,但這倆框在資源檢視...
模式對話方塊與無模式對話方塊
顯示子窗體 1 showdialog 無模式對話方塊 babywindow.showdialog 顯示子窗體 showdialog 無模式對話方塊 無模式 窗體讓您在此窗體與另一窗體之間變換焦點,而不必關閉初始窗體。使用者在該窗體顯示的同時可繼續在任何應用程式的其他位置工作。例如 文字編輯軟體裡面的...
MFC 對話方塊程式 模式對話方塊與非模式對話方塊
一 根據主視窗型別,mfc軟體工程可以分為以下幾種架構模型 例如 記事本和畫筆等。2 mdi multiple document inte ce 多文件介面,乙個主框架視窗下可以同時編輯多份文件。例如 vc 6.0,photoshop等軟體。3 基於對話方塊的軟體模型 主視窗是通過資源管理器,在對話...