視窗物件的自動刪除

2021-05-22 02:29:02 字數 1800 閱讀 1434

乙個mfc視窗物件包括兩方面的內容:一是視窗物件封裝的視窗,即存放在m_hwnd成員中的hwnd(視窗控制代碼),二是視窗物件本身是乙個c++物件。要刪除乙個mfc視窗物件,應該先刪除視窗物件封裝的視窗,然後刪除視窗物件本身。

刪除視窗最直接方法是呼叫cwnd::destroywindow或::destroywindow,前者封裝了後者的功能。前者不僅會呼叫後者,而且會使成員m_hwnd儲存的hwnd無效(null)。如果destroywindow刪除的是乙個父視窗或擁有者視窗,則該函式會先自動刪除所有的子視窗或被擁有者,然後再刪除父視窗或擁有者。在一般情況下,在程式中不必直接呼叫destroywindow來刪除視窗,因為mfc會自動呼叫destroywindow來刪除視窗。例如,當使用者退出應用程式時,會產生wm_close訊息,該訊息會導致mfc自動呼叫cwnd::destroywindow來刪除主框架視窗,當使用者在對話方塊內按了ok或cancel按鈕時,mfc會自動呼叫cwnd::destroywindow來刪除對話方塊及其控制項。

視窗物件本身的刪除則根據物件建立方式的不同,分為兩種情況。在mfc程式設計中,會使用大量的視窗物件,有些視窗物件以變數的形式嵌入在別的物件內或以區域性變數的形式建立在堆疊上,有些則用new操作符建立在堆中。對於乙個以變數形式建立的視窗物件,程式設計師不必關心它的刪除問題,因為該物件的生命期總是有限的,若該物件是某個物件的成員變數,它會隨著父物件的消失而消失,若該物件是乙個區域性變數,那麼它會在函式返回時被清除。對於乙個在堆中動態建立的視窗物件,其生命期卻是任意長的。用new在堆中建立物件,就不能忘記用delete刪除物件。讀者會產生這樣的疑問,為什麼有些程式用new建立了乙個視窗物件,卻未顯式的用delete來刪除它呢?答案就是有些mfc視窗物件具有自動清除的功能。

如非模態對話方塊時所提到的,當呼叫cwnd::destroywindow或::destroywindow刪除乙個視窗時,被刪除視窗的postncdestroy成員函式會被呼叫。預設的postncdestroy什麼也不幹,但有些mfc視窗類會覆蓋該函式並在新版本的postncdestroy中呼叫delete this來刪除物件,從而具有了自動清除的功能。此類視窗物件通常是用new操作符建立在堆中的,但程式設計師不必操心用delete操作符去刪除它們,因為一旦呼叫destroywindow刪除視窗,對應的視窗物件也會緊接著被刪除。

不具有自動清除功能的視窗類如下所示。這些視窗物件通常是以變數的形式建立的,無需自動清除功能。

所有標準的windows控制項類

從cwnd類直接派生出來的子視窗物件(如使用者定製的控制項)

切分視窗類csplitterwnd

預設的控制條類(包括工具條、狀態條和對話條)

模態對話方塊類

具有自動清除功能的視窗類如下所示,這些視窗物件通常是在堆中建立的。

主框架視窗類(直接或間接從cframewnd類派生)。

檢視類(直接或間接從cview類派生)。

綜上所述,對於mfc視窗類及其派生類來說,在程式中一般不必顯式刪除視窗物件。也就是說,既不必呼叫destroywindow來刪除視窗物件封裝的視窗,也不必顯式地用delete操作符來刪除視窗物件本身。只要保證非自動清除的視窗物件是以變數的形式建立的,自動清除的視窗物件是在堆中建立的,mfc的執行機制就可以保證視窗物件的徹底刪除。

如果需要手工刪除視窗物件,則應該先呼叫相應的函式(如cwnd::destroywindow)刪除視窗,然後再刪除視窗物件.對於以變數形式建立的視窗物件,視窗物件的刪除是框架自動完成的.對於在堆中動態建立了的非自動清除的視窗物件,必須在視窗被刪除後,顯式地呼叫delete來刪除物件.對於具有自動清除功能的視窗物件,只需調cwnd::destroywindow即可刪除視窗和視窗物件。注意,對於在堆中建立的視窗物件,不要在視窗還未關閉的情況下就用delete操作符來刪除視窗物件.

視窗物件的自動清除

乙個mfc視窗物件包括兩方面的內容 一是視窗物件封裝的視窗,即存放在m hwnd成員中的hwnd 視窗控制代碼 二是視窗物件本身是乙個c 物件。要刪除乙個mfc視窗物件,應該先刪除視窗物件封裝的視窗,然後刪除視窗物件本身。刪除視窗最直接方法是呼叫cwnd destroywindow或 destroy...

TTreeview如何儲存自動刪除的物件

1 新建儲存許可權的類 struct tprivelege int id string strname ss2 繼承ttrrenode類 lass mynode public ttreenode fastcall mynode ttreenodes aowner,int id,string strn...

視窗類 視窗類物件與視窗

我們可以發現,sdk 程式中多了乙個 hwnd 型別的變數 hwnd 該變數用來儲存由 createwindowex函式建立的視窗控制代碼,並將其作為引數傳遞給隨後的顯示視窗操作 showwindow 函式 和更新視窗操作 updatewindow 函式 而我們自定義的實現 中,cwnd 類定義了乙...