2014-06-09 6 views
0

MFC MDI 응용 프로그램을 사용하고 있습니다. 알림의 모든 하위 창을 닫으 려합니다.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

다시 칠하는 문제가 전혀 없습니다 '최신 정보'? – user1793036

+0

아마도 Child Frame에 대해 Invalidate()를 호출 할 수 있습니다. http://msdn.microsoft.com/en-us/library/ax04k970.aspx – cha

+1

창을 닫거나 소멸 시키면 해당 부모 창 영역이 다시 그려지는 것이 일반적인 경우입니다. 어떤 조치도 필요 없습니다. 다시 그릴 때 문제가 발생하면 WM_PAINT 처리기가 실패합니다. – xMRi

답변

1

보기를 닫지 마십시오. 상위 프레임을 닫으십시오.

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를 사용하지 않는 한, 파괴 될 때, 클라이언트 영역을 다시 그립니다 때문에 ..., 당신은에 의해 무슨 뜻 이죠