创建窗口
在一个通常的程序中,先创建c++窗口对象,然后由Windows创建实际的窗口结构,并返回句柄与c++对象连接。也就是说,窗口对象包含c++窗口对象和Windows窗口,两者通过句柄HWND联系。
窗口清除
对象清除是指释放对象所占的资源,窗口对象中Windows窗口占有的是系统资源,c++对象占有的是内存资源。
-
窗口清除流程:调用虚函数DestroyWindow删除Windows窗口对象。如果DestroyWindow删除的是父窗口,Windows会自动为子窗口调用DestroyWindow.一般来说,程序不必调用DestroyWindow。因为当用户关闭窗口时, Windows便发送WM_CLOSE消息,WM_CLOSE的缺省消息处理函数CWnd::OnClose调用。【屏幕上的窗口已经不见了!】
-
窗口对象清除流程:到这时,在内存中还有一个c++窗口对象。当窗口被取消时,窗口最后发送的一个消息是WM_NCDESTROY。它缺省的消息处理函数CWnd::OnNcDestroy把c++窗口对象与句柄HWND分离,并调用一个很重要的虚函数PostNcDestroy。
窗口对象本身的删除则根据对象创建方式的不同,分为两种情况。
-
【非自动清除】有些以变量的形式嵌入在别的对象内或以局部变量的形式创建在堆栈上。不必关心它的删除,因为其生命期总是有限的,若该对象是某个对象的成员变量,它会随着父对象的消失,若该对象是一个局部变量,那么它会在函数返回时被清除。
-
所有标准的Windows控件类。
-
从CWnd类直接派生出来的子窗口对象(如用户定制的控件)。
-
切分窗口类CSplitterWnd。
-
缺省的控制条类(包括工具条、状态条和对话条)。
-
模态对话框类【PostNcDestroy中为空】。
-
-
【自动清除】有些则用new操作符创建在堆中。对于一个在堆中动态创建的窗口对象,其生命期却是任意长的。需要通过delete删除。
-
主框架窗口类(直接或间接从CFrameWnd类派生)。
-
视图类(直接或间接从CView类派生)【PostNcDestroy中带有delete this】。
-
总结
对于MFC窗口类及其派生类来说,在程序中一般不必显式删除窗口对象。既不必调用DestroyWindow来删除窗口对象封装的窗口,也不必显式地用delete操作符来删除窗口对象本身。
非自动清除的窗口对象是以变量的形式创建的;
自动清除的窗口对象是在堆中创建的;
MFC的运行机制就可以保证窗口对象的彻底删除。