VC 中MFC視窗物件的清除

2021-04-21 17:30:03 字數 3123 閱讀 2167

對於vc++

初學者來說

,總覺得視窗物件的清除過程有些莫名其妙

.在程式中看不到對

delete

的顯式呼叫

,這似乎違反了

c++中有關初始化和清除的規則.那麼

,程式是怎樣取消乙個視窗物件

? 要消除視窗物件

,必須清楚視窗物件的構成

.在乙個通常的程式中,先建立

c++視窗物件

,然後由

windows

建立實際的視窗結構

,並返回控制代碼與

c++物件連線

.也就是說

,視窗物件包含

c++視窗物件和

windows

視窗物件

,兩者通過控制代碼

hwnd

聯絡. 現在,

讓我們看看"正規

"的視窗物件清除流程

.所謂物件的清除是指釋放物件所佔的資源

,視窗物件中

windows

視窗物件佔有的是系統資源

,c++

物件佔有的是記憶體資源

.釋放系統資源相對要簡單一些

:呼叫虛函式

destroywindow

刪除windows

視窗物件.如果

destroywindow

刪除的是父視窗

,windows會自動

為子視窗呼叫

destroywindow.

一般來說

,程式不必呼叫

destroywindow.

因為當使用者關閉視窗時

,windows

便傳送wm_close

訊息,wm_close

的預設訊息處理函式

cwnd::onclose

呼叫destroywindow.

到這時,

清除工作已經完成了一半

,螢幕上的視窗已經不見了

!但是別忘了

,在記憶體中還有乙個

c++視窗物件

.讓我們再看看

c++物件清除的過程

:當視窗被取消時

,視窗最後傳送的乙個訊息是

wm_ncdestroy.

它預設的訊息處理函式

cwnd::onncdestroy

把c++

視窗物件與控制代碼

hwnd分離,

並呼叫乙個很重要的虛函式

postncdestroy.

這個函式是搞清視窗物件清除的關鍵

.cwnd

中的postncdestroy

什麼都不做.有些

mfc視窗類會過載它

,並加入

delete this

**刪除

c++物件

.這些視窗類常常是以

new操作符建立在堆中的

.由於過載了

postncdestroy,

使視窗有

自動清除功能.因此

,我們不用關心清除問題了

.另外的一些

mfc視窗類一般是以變數形式建立的

,mfc

沒有為也沒必要為它們過載

postncdestroy

函式.

不具備自動

清除功能的視窗類

,一般在堆疊中建立或嵌入於其它

c++物件中

: 所有標準的

windows

控制項類(

如cstatic, cedit, clistbox

等等)

由cwnd

類直接派生出來的子視窗物件

(如使用者定製的控制項

) 拆分視窗類

(csplitterwnd)

預設的控制條類

(ccontrolbar

的派生類

) 對話方塊類

(cdialog)

在堆疊上建立的模態對話方塊類

所有的windows

通用對話方塊(除

cfindreplacedialog)

由classwizard

建立的對話方塊

具有自動

清除功能的視窗類

,一般在堆中建立

: 主框架視窗類

(直接或間接從

cframewnd

類派生)

檢視類(

直接或間接從

cview

類派生)

從某種程度上來說

,mfc

的"服務到家"

使初學者有些找不著北.不過

,不得不承認

:mfc

幹的很漂亮

! 談到這裡

,我們應該明白

c++裡一條重要的準則:用

destroywindow

清除視窗物件

,不要用

"delete".

對於不具備

自動清除功能的視窗類使用

"delete"

時,"delete"

先呼叫析構函式裡的

destroywindow,

由於在析構函式中

,虛機制不起作用

,這裡只能呼叫本地版本

(cwnd

類)destroywindow函式,

顯然這不是我們想要的

.對於有

自動清除功能的視窗類

,好象問題更嚴重一點

,前面提到了過載的

postncdestroy

已經含有了

"delete this",

這樣c++

物件就被釋放了兩次

. 很多人認為

,vc++同vb

一樣,是乙個完全視覺化的產品

,不用在看

c++的書了

.通過上面對視窗物件的清除的介紹

,可以發現

,windows

程式是與

windows

緊密結合的

,而且牽涉到很多

c++的知識

(如虛函式、析構函式、

new操作符等

).要對

vc++

有進一步理解

,必須理解

windows機制,

深入學習

c++.

VC 中MFC視窗物件的清除

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

視窗物件的自動清除

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

MFC中的視窗

mfc 視窗 mfc視窗不對視窗進行直接的控制,而在api環境中卻是可以的。如果不能在api環境中實現某項功能,那麼 肯定也不能在mfc環境中實現。舉例來說,mfc庫的cwnd可以建立乙個視窗,但它只是過去在api環境中使用 api呼叫的封裝。建立mfc視窗是複雜的,首先,建立類cwnd的乙個例項,...