視窗物件的自動清除

2021-05-22 11:25:02 字數 2031 閱讀 2772

乙個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操作符建立在堆中。對於乙個以變數形式建立的視窗物件,程式設計師不必關心它的刪除問題,因為該物件的生命期總是有限的,若該物件是某個物件的成員變數,它會隨著父物件的消失而消失,若該物件是乙個區域性變數,那麼它會在函式返回時被清除。 

對於乙個在堆中動態建立的視窗物件,其生命期卻是任意長的。初學者在學習c++程式設計時,對new操作符的使用往往不太踏實,因為用new在堆中建立物件,就不能忘記用delete刪除物件。讀者在學習mfc的例程時,可能會產生這樣的疑問,為什麼有些程式用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...

VC 中MFC視窗物件的清除

對於vc 初學者來說,總覺得視窗物件的清除過程有些莫名其妙.在程式中看不到對delete的顯式呼叫,這似乎違反了c 中有關初始化和清除的規則.那麼,程式是怎樣取消乙個視窗物件?要消除視窗物件,必須清楚視窗物件的構成.在乙個通常的程式中,先建立c 視窗物件,然後由windows建立實際的視窗結構,並返...

VC 中MFC視窗物件的清除

對於vc 初學者來說 總覺得視窗物件的清除過程有些莫名其妙 在程式中看不到對 delete 的顯式呼叫 這似乎違反了 c 中有關初始化和清除的規則.那麼 程式是怎樣取消乙個視窗物件 要消除視窗物件 必須清楚視窗物件的構成 在乙個通常的程式中,先建立 c 視窗物件 然後由 windows 建立實際的視...