轉:mfc窗口的銷燬

 一段很好的文章:(作者:聞怡洋) 

  一個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控件類。 

  1. 從CWnd類直接派生出來的子窗口對象(如用戶定製的控件)。 

  2. 切分窗口類CSplitterWnd。 

  3. 缺省的控制條類(包括工具條、狀態條和對話條)。 

  4. 模態對話框類。

  具有自動清除功能的窗口類如下所示,這些窗口對象通常是在堆中創建的。 

  1. 主框架窗口類(直接或間接從CFrameWnd類派生)。 

  2. 視圖類(直接或間接從CView類派生)。

  讀者在設計自己的派生窗口類時,可根據窗口對象的創建方法來決定是否將窗口類設計成可以自動清除的。例如,對於一個非模態對話框來說,其對象是創建在堆中的,因此應該具有自動清除功能。 

  綜上所述,對於MFC窗口類及其派生類來說,在程序中一般不必顯式刪除窗口對象。也就是說,既不必調用DestroyWindow來刪除窗口對象封裝的窗口,也不必顯式地用delete操作符來刪除窗口對象本身。只要保證非自動清除的窗口對象是以變量的形式創建的,自動清除的窗口對象是在堆中創建的,MFC的運行機制就可以保證窗口對象的徹底刪除。 

  如果需要手工刪除窗口對象,則應該先調用相應的函數(如CWnd::DestroyWindow)刪除窗口,然後再刪除窗口對象.對於以變量形式創建的窗口對象,窗口對象的刪除是框架自動完成的.對於在堆中動態創建了的非自動清除的窗口對象,必須在窗口被刪除後,顯式地調用delete來刪除對象(一般在擁有者或父窗口的析構函數中進行).對於具有自動清除功能的窗口對象,只需調用CWnd::DestroyWindow即可刪除窗口和窗口對象。注意,對於在堆中創建的窗口對象,不要在窗口還未關閉的情況下就用delete操作符來刪除窗口對象

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章