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

问题描述 投票:0回答:1

我正在使用 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 在整个子窗口区域中显示黑屏。
我想在关闭所有子窗口后更新这个窗口区域。
我怎样才能更新这个区域?

visual-c++ mfc mdi mdichild
1个回答
2
投票

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

POSITION posTemplate = AfxGetApp()->GetFirstDocTemplatePosition();
while (posTemplate != NULL)
{
    CDocTemplate *pDocTemplate = AfxGetApp()->GetNextDocTemplate(posTemplate);
    if (pDocTemplate == NULL)
        break;

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

        POSITION posView = pDoc->GetFirstViewPosition();
        while (posView != NULL)
        {
            CView* pView = pDoc->GetNextView(posView);
            if (pView == NULL)
                break;

            pView->GetParentFrame()->DestroyWindow();
        }
    }
}

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

重绘永远不会有问题,因为父窗口总是重绘它的客户区,当子窗口被销毁时,只要你不使用SetRedraw...

© www.soinside.com 2019 - 2024. All rights reserved.