非模態對話方塊的建立和銷毀過程

2021-07-26 08:47:33 字數 1836 閱讀 7434

建立非模態對畫框的過程:見

乙個非模態的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對話方塊分為兩類 模態對話方塊和非模態對話方塊。模態對話方塊 當它彈出後,本應用程式其他視窗將不再接受使用者輸入,只有該對話方塊響應使用者輸入,在對它進行相應操作退出後,其他視窗才能繼續與使用者互動。非模態對話方塊 它彈出後,本程式其他視窗仍能響應使用...