VC++中MFC窗口对象的清除

分类: VC.NET   出处:iocblog整理  更新时间:2008-07-26   添加到收藏  

 对于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创建的对话框

[1] [2] 下一页


Tag: MFC