当前位置:C++技术网 > 资讯 > 销毁C++窗口对象的内部过程深度解析

销毁C++窗口对象的内部过程深度解析

更新时间:2015-06-25 19:42:03浏览次数:1+次

    学习MFC时,MFC的窗口类已经包含了窗口句柄,至于如何包含,在销毁窗口时又是如何分离的,始终都搞不清楚,总是一团迷糊。使用DestroyWindow函数时总是有一种隐隐的担心,怕使用错了,将什么给释放了会导致程序崩溃。今天就深入研究了一下,为了进一步深入了解,让使用更加灵活,本文深入分析MFC窗口对象销毁的内部执行过程。下面给大家分享内部的执行过程。
    MFC的基于CWnd的类都是MFC窗口类。所谓的MFC窗口类都是MFC将windows的窗口句柄与C++对象绑定了,形成一个整体,这样就简化了编程,提高了效率。而封装之后,对其内部的过程就不容易懂了,因此导致在使用上总是觉得不自在。并且很多时候也会用错。
    想要了解MFC窗口对象的创建和最后销毁的整个过程的分析,请阅读文章《MFC中的窗口类:C++类与窗口句柄的结合深入浅出分析》。推荐先看看,不然本文可能看的有点不太好懂。
    以下提到的C++窗口类就是关联了窗口的C++类。如果CWnd对象没有关联窗口就是C++对象,如果关联了窗口,那么就是C++窗口对象。
    MFC销毁窗口是从调用DestroyWindow开始的,当然,这个DestroyWindow不是API函数,是CWnd的成员函数。CWnd就是包装了窗口的C++对象。
    DestroyWindow函数中,有一个CWnd指针和一个关联指针,这个关联指针就是管理C++对象与窗口句柄的关联的。如果销毁时,CWnd窗口对象的m_hWnd没有值,表示没有关联,如果此时窗口对象也没有关联控件,自然也就不用去释放窗口和控件资源了,这样函数就返回了。
    如果是有关联的窗口或者关联了控件,那么就继续往下执行释放资源的操作。在释放前,要取得C++窗口对象的管理的资源,就要得到一个关联管理指针。
    因为资源是与模块相关的。模块就是EXE或者DLL等。每个资源都是存在于模块中的,所以要得到C++窗口对象所关联的资源,那就要到模块中找。通过函数AfxGetModuleThreadState获得模块的线程状态指针,然后找到对应的模块与C++窗口对象所关联句柄。如果是创建CWnd对象时,那么此时CWnd的窗口句柄时空的,那么此时就要将模块中的窗口句柄与C++对象关联。而在销毁时,CWnd的窗口句柄是有值的,所以就直接返回这个管理关联指针即可。
    获取关联管理指针后,然后就要通过CWnd对象中的窗口句柄来返回关联管理指针中与此窗口句柄匹配的窗口对象指针。
    如果没有关联的控件,那么就直接调用API函数DestroyWindow销毁窗口CWnd对象中窗口句柄对应的窗口资源,即与本窗口对象关联的窗口资源,如果有控件,那么就要销毁控件和窗口资源。
    最后才是调用Detach函数将窗口对象即CWnd对象与窗口资源解关联。
    总结上面的过程,就是,销毁窗口要释放窗口和控件的资源,然后与C++窗口对象解关联。C++对象会在析构函数中自己销毁,就不用我们去担心了。