关闭MFC MDI应用程序中的所有子窗口

时间:2014-06-09 06:29:29

标签: visual-c++ mfc mdi mdichild

我正在使用MFC MDI应用程序。我想在通知上关闭所有子窗口。为此,我使用此代码:

CMDIFrameWnd *pFrame = NULL;
    CMDIChildWnd *pChild = NULL;
    CDocTemplate* pDocTemplate = NULL;
    CDocument* pDoc = NULL;

    for (POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition(); pos != NULL; )
    {
        pDocTemplate = AfxGetApp()->GetNextDocTemplate( pos );

        for (POSITION pos1 = pDocTemplate->GetFirstDocPosition(); pos1 != NULL; )
        {
            if (pos1 == NULL)
                break;
            CDocument* pDoc = pDocTemplate->GetNextDoc( pos1 );

            for (POSITION pos2 = pDoc->GetFirstViewPosition(); pos2 != NULL; )
            {
                CView* pView = (CSignalWindow*)pDoc->GetNextView( pos2 );
                pView->CloseWindow();
            }
        }
    }

执行此代码时,在调试模式下,它会关闭所有窗口,UI在整个子窗口区域显示黑屏。
我想在关闭所有子窗口后更新此窗口区域 我如何更新这个区域?

1 个答案:

答案 0 :(得分:2)

您不应该关闭视图。只需关闭父框架。

for (POSITION posTemplate = AfxGetApp()->GetFirstDocTemplatePosition(); pos != NULL; )
{
    pDocTemplate = AfxGetApp()->GetNextDocTemplate(posTemplate);

    POSITION posDoc;
    while (posDoc = pDocTemplate->GetFirstDocPosition())
    {
        CDocument* pDoc = pDocTemplate->GetNextDoc(posDoc);

        POSITION posView;
        while (posView=pDoc->GetFirstViewPosition())
        {
            CView* pView = pDoc->GetNextView(posView);
            pView->GetParentFrame()->DestroyWindow();
        }
    }
}

因为您要关闭所有内容,所以您只需要获取列表的头部并将其删除即可。 如果在一个子帧(即分割窗口)中收集视图,则对帧使用DestroyWindow可能会删除多个视图。

重绘时不应该出现问题,因为只要您不使用SetRedraw,父窗口就会在子窗口被破坏时重绘其客户区域。