模態對話方塊與非模態對話的幾種銷毀方法與區別

2021-07-12 02:28:13 字數 3710 閱讀 5887

模態對話方塊與非模態對話的幾種銷毀方法與區別

先著乙個注意點,自己誤識了好久:

closewindow是乙個函式,可以用來最小化指定的視窗,但並不銷毀該視窗。

先說下模式對話方塊呼叫的原則。

模式對話方塊下,用cdialog::onok()或cdialog::oncancel()以及cdialog::onclose()關閉對話方塊。

一定要注意之前的cdialog::(當然,你可以過載你自己對話方塊的這個虛函式,但是,後面必須呼叫基類的cdialog::

具體我們再參照深入淺出的風格,來個解刨。 

cdialog::close()預設呼叫cdialog::oncancel(),

cdialog::oncancel()呼叫cdialog::enddialog(

idcancel);

cdialog::enddialog(

idcancel

)呼叫cdialog::destroywindows(),

cdialog::destroywindows呼叫cdialog::ondestroy();

cdialog::onok()

呼叫cdialog::enddialog(

idok).

cdialog::enddialog(

idok

)呼叫updatedata()和

cdialog::destroywindows(),

cdialog::destroywindows呼叫cdialog::ondestroy()   

看來上面你可能就知道了如下的過程

cdialog::

close()

==>cdialog::

oncancel()

==>

cdialog::

enddialog(

idcancel)

cdialog::

onok()

==>cdialog::

enddialog(

idok)

cdialog::

destroywindows()

==>cdialog::

ondestroy()

cdialog::enddialog(idok) ==   

cdialog::

updatedata()

cdialog::

destroywindows()

==>cdialog::

ondestroy()

cdialog::enddialog(idcancel) ==

cdialog::

destroywindows()

==>cdialog::

ondestroy()

cdialog::enddialog(idok)跟cdialog::enddialog(idcancel)的區別就是,少了乙個cdialog::updatedata(),也就是cdialog::enddialog(idok),在關閉對話方塊後,會把對話方塊上控制項關聯的變數的值更新為使用者最後輸入的值。而cdialog::enddialog(idcancel)就不會更新這個值。

希望自己把模式對話方塊的關閉講清楚了。

下面說說非模態對話方塊

呼叫原則是:  一定要用destroywindow()來結束非模態對話方塊...因為呼叫cdialog::create() 時是在堆上 new的物件...需要destroywindow來delete 物件..不然會存在資源洩漏的風險...,不要用wm_close訊息,它不會銷毀非模態對話方塊,用destroywindow()是最正確的方法(當然,你可以在響應wm_close的時候呼叫

destroywindow)

在無模式對話方塊,過載你自己的onok(),就是cmydialog::onok()呼叫cdialog::destroywindows()。

注意:過載的onok中不不要呼叫父類的onok即

cdialog::onok(),因為cdialog::onok()會呼叫enddialog,而enddialog是模態對話方塊專用的

過載cmydialog::oncancel()呼叫cdialog::destroywindows()。

注意:過載的oncancel中不不要呼叫父類的oncancel即

cdialog::oncancel(),因為cdialog::oncancel()會呼叫enddialog,而enddialog是模態對話方塊專用的

聽起來很簡單,但是下面提到乙個很具體的程式設計問題。

一般,我們用非模態對話方塊都是全域性的,也就是通過new來建立,是在heap上的,而不是在stack上的。

這樣我們當然還要通過delete 來銷毀物件,不然可是有記憶體洩漏的。那麼我們什麼時候delete這個物件呢?

在msdn上面我們可以看到微軟提供的方法是:wm_ncdestroy

響應這個訊息的時候是delete掉非模態對話物件的最佳時機

所以我們要響應wm_ncdestroy訊息:

void cmainshowdlg::onncdestroy()

這樣的話,我們的類就會auto-cleanup了。

模態對話方塊與非模態對話方塊

1.對話方塊分類 按工作方式不同,可將對話方塊分成兩類 模態對話方塊 modal 在關閉模態對話方塊之前,程式不能進行其他工作 如一般的 開啟檔案 對話方塊 非模態對話方塊 modeless 非模態對話方塊開啟後,程式仍然能夠進行其他工作 如一般的 查詢與替換 對話方塊 2.對話方塊建立 模態對話方...

模態對話方塊與非模態對話方塊

建立對話方塊 case id dialog text dialogbox hinst,makeintresource idd textbox hwnd,textset break 建立模態對話方塊 case id dialog tcolor dhwnd createdialog hinst,make...

模態與非模態對話方塊

vc 模態對話方塊建立 domodal 模式對話方塊關閉順序 1.onclose 訊息響應函式,響應wm close訊息,當 關閉 按鈕被單擊的時候,該函式被呼叫 2.onkillfocus 訊息響應函式,響應wm killfocus訊息,當乙個視窗即將失去鍵盤輸入焦點以前被傳送 3.ondestr...