建立非模態對畫框的過程:見
乙個非模態的mfc視窗的銷毀過程:
假設自己通過
new建立了乙個視窗物件
pwnd
,然後pwnd->create
。則銷毀視窗的呼叫次序:
1.
手工呼叫
pwnd->destroywindow()
;//
一般在對話方塊類中的
oncancle
函式中postmessage(wm_destory)
或者直接呼叫
2. destroywindow
會傳送wm_destroy;
3. wm_destroy
對應的訊息處理函式是
ondestroy();
4. destroywindow
會傳送wm_ncdestroy;
5. wm_ncdestroy
對應的訊息處理函式是
onncdestroy;
6. onncdestroy
最後會呼叫
postncdestroy;
7. postncdestroy
經常被使用者過載以提供釋放記憶體操作。例如可以使用
delete this;
通過這種方式,視窗物件對應的視窗和視窗物件本身都被釋放了。
對於非模態視窗,必須過載
oncancel
函式,在函式中呼叫
destroywindows()
方法,且不能呼叫基類的函式。因為基類函式中呼叫的是
enddialog()
方法。(因為
enddialog
是關閉模態對話方塊時呼叫的)而
onclose()
也會呼叫
oncancel()
方法。另外想通過
onok
關閉對話方塊,也必須同樣處理,不能直接用預設方法。
所以對於非模態視窗,其關閉過程為:
onclose()->oncancel()->destroywindow()->ondestroy()->onncdestroy()
->
postncdestroy()->
僅表示時間先後而已 而
onncdestroy()
最後又呼叫了
postncdestroy()
對於domodal出來的視窗,可以使用預設的onok()和oncancel()來處理。其基類方法中會呼叫enddialog()方法。
最後注意乙個問題,
通常我們建立乙個非模態視窗時,可能會這樣寫
一般是在乙個模組或者乙個函式中建立視窗,但是卻無法知道什麼時候關閉視窗。而
pwnd
也只是作為乙個區域性變數。那麼如何對它進行析構呢?
通常這樣是過載虛函式
postncdestroy()
來實現
void cmydialog::postncdestroy()
為什麼把對話方塊類的delete this放在postncdestroy中而不是onncdestroy?
這是因為
onncdestroy
只被已建立的視窗呼叫
。如果建立視窗失敗(如
precreatewindow)
,則沒有視窗出來傳送
非模態對話方塊的建立於銷毀
橡皮線的工作原理 就必須不停地在新位置畫出線段,並把以前的畫出的線段擦掉。如果背景是單一的顏色,那就好辦了,只需要構造一支背景顏色的畫筆和一支前景顏色的畫筆,然後首先用背景色畫筆擦出上次的線段,再用前景顏色的畫筆畫出新的線段,就可以實現橡皮線了。由於橡皮線的起點是不變的,而終點在不停地改變,因此,還...
非模態對話方塊的建立和刪除
1 模式對話方塊 在模式對話方塊下,用cdialog onok 或cdialog oncancel 以及cdialog onclose 關閉對話方塊。一定要注意之前的cdialog 當然,你可以過載你自己對話方塊的這個虛函式,但是,後面必須呼叫基類的cdialog 具體我們再參照深入淺出的風格,來個...
模態對話方塊和非模態對話方塊的建立彈出
一 模態對話方塊的建立及顯示 1 windows對話方塊分為兩類 模態對話方塊和非模態對話方塊。模態對話方塊 當它彈出後,本應用程式其他視窗將不再接受使用者輸入,只有該對話方塊響應使用者輸入,在對它進行相應操作退出後,其他視窗才能繼續與使用者互動。非模態對話方塊 它彈出後,本程式其他視窗仍能響應使用...