当前位置:C++技术网 > 资讯 > 窗口的删除与窗口对象的删除的详细说明

窗口的删除与窗口对象的删除的详细说明

更新时间:2015-06-25 17:21:34浏览次数:1+次

    MFC的窗口对象是怎样从系统中清除的呢?要弄清楚这个问题,必须先搞清楚窗口对象的成分。
  
    一个MFC窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在m_hWnd成员中的HWND(窗口句柄),二是窗口对象本身是一个C++对象。要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。也就是窗口的C++对象的生存期要比窗口长。

    窗口的删除
    删除窗口最直接方法是调用CWnd:: DestroyWindow或全局API函数:: DestroyWindow,前者封装了后者的功能。前者不仅会调用后者,而且会使成员m_hWnd保存的HWND无效(设置为NULL)。如果DestroyWindow删除的是一个父窗口或拥有者窗口,则该函数会先自动删除所有的子窗口或被拥有者,然后再删除父窗口或拥有者窗口。在一般情况下,在程序中不必直接调用DestroyWindow来删除窗口,因为MFC会自动调用DestroyWindow来删除窗口。例如,当用户退出应用程序时,会产生WM_CLOSE消息,该消息会导致MFC自动调用CWnd:: DestroyWindow来删除主框架窗口。当用户在对话框内按了OK或Cancel按钮时,可调用CWnd::DestroyWindow来删除对话框及其控件。如果发现退出时并没有调用CWnd:: DestroyWindow,请自己调用这个函数,或者你可以对WM_CLOSE进行响应来销毁窗口。

    窗口对象的删除
    窗口对象本身的删除则根据对象创建方式的不同,分为两种情况。在MFC编程中,会使用大量的窗口对象,有些窗口对象以变量的形式嵌入在别的对象内或以局部变量的形式创建在堆栈上,有些则用new操作符创建在堆中。
    对于一个以变量形式创建的窗口对象,程序员不必关心它的删除问题,因为该对象的生命期总是有限的,若该对象是某个对象的成员变量,它会随着父对象的消失而消失,若该对象是一个局部变量,那么它会在函数返回时被清除。
    对于一个在堆中动态创建的窗口对象,其生命期却是任意长的。因为用new在堆中创建对象,就不能忘记用delete删除对象。有些MFC窗口对象具有自动清除的功能。不需要程序员显示的调用delete来删除它。