我正在使用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在整个子窗口区域显示黑屏。
我想在关闭所有子窗口后更新此窗口区域
我如何更新这个区域?
答案 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,父窗口就会在子窗口被破坏时重绘其客户区域。