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

2021-07-03 05:46:36 字數 4073 閱讀 8373

最近在做win32調對話方塊,挺鬱悶,找了好多文章研究,才發現非常簡單。

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

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

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

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

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

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

idcancel);

cdialog::enddialog呼叫cdialog::destroywindows(),

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

cdialog::onok()預設先

cdialog::updatedata()

再呼叫cdialog::enddialog(

idok).

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

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

下面說說非模態對話方塊

呼叫原則是:  一定要用destroywindow()來結束非模態對話方塊...因為呼叫cdialog::create() 時是在堆上 new的物件...需要destroywindow來delete 物件..不然會存在資源洩漏的風險...

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

注意:不是預設的cdialog::onok()來關閉對話方塊。

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

注意:不是呼叫預設的cdialog::oncancel(),來關閉對話方塊。

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

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

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

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

我們要過載postncdestroy(),即我們要實現cmydialog::postncdestroy(),內容如下

[cpp]view plain

copy

print?

cmydialog::postncdestroy()    

cmydialog::postncdestroy()

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

[cpp]view plain

copy

print?

hwnd hmain = createdialog(hinstance, (lpctstr)idd_dialog1, hwnd,(dlgproc)dlgproc);  

showwindow(hmain, sw_show);  

settimer(hmain, 10, 5000, null);  

hwnd hmain = createdialog(hinstance, (lpctstr)idd_dialog1, hwnd,(dlgproc)dlgproc);

showwindow(hmain, sw_show);

settimer(hmain, 10, 5000, null);

仿造about處理訊息改一下就好了。

[cpp]view plain

copy

print?

int_ptr callback dlgproc(hwnd hdlg, uint message, wparam wparam,lparam lparam)  

else

if(wparam ==idcancel)  

case wm_timer:  

if (wparam == 10)  

return (int_ptr)false;  

}  

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

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...