我正在使用 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 在整个子窗口区域中显示黑屏。
我想在关闭所有子窗口后更新这个窗口区域。
我怎样才能更新这个区域?
您不应该关闭视图。只需关闭父框架即可。
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...