1、 无文档的多视图程序的毁灭顺序及解决方法
在无文档的多视图程序中,程序主框架、子框架、及视图,在通常情况下,如果你直接关闭程序主框架,程序直接调用destroywindow,子框架及视图则自动清理,但程序不会调用子框架的destroywindow以及postncdestroy两个函数,如果你先关闭视图,关闭的顺序如下,程序先调用子框架的的destroywindow,然后调用视图的postncdestroy,接着就是子框架的postncdestroy,程序里没有调用到视图的destroywindow。
有些情况下,必须保证程序的先子框架关闭,这时候上面这个顺序就会造成程序出错了,正如前面所说,直接关闭主框架时只调用了一个destroywindow函数,其余的函数都不执行了。解决的思路,我们得把程序的毁灭顺序改一改,把子框架的毁灭放在主框架毁灭之前:
CChildFrame *pChildFrame = (CChildFrame *)this->GetActiveFrame();
while (pChildFrame)
{
pChildFrame->DestroyWindow();
pChildFrame = (CChildFrame *)this->GetActiveFrame();
}
通过此循环,可以将所有子框架删除,在循环中,调用的GetActiveFrame函数是获得当前活动子框架,在删除当前活动子框架时,其它的子框架又会变成活动子框架,所以这种方法不会造成死循环。
2、 多文档视图程序的毁灭顺序
它和上面的情况差不多,只是多了一个文档,它的毁灭是在子框架的OnClose之后,子框架的destroywindow之前。