void CDocument::UpdateFrameCounts() // assumes 1 doc per frame { // walk all frames of views (mark and sweep approach) POSITION pos = GetFirstViewPosition(); while (pos != NULL) { CView* pView = GetNextView(pos); ASSERT_VALID(pView); ASSERT(::IsWindow(pView->m_hWnd)); if (pView->IsWindowVisible()) // Do not count invisible windows. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL) pFrame->m_nWindow = -1; // unknown } } // now do it again counting the unique ones int nFrames = 0; pos = GetFirstViewPosition(); while (pos != NULL) { CView* pView = GetNextView(pos); ASSERT_VALID(pView); ASSERT(::IsWindow(pView->m_hWnd)); if (pView->IsWindowVisible()) // Do not count invisible windows. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL && pFrame->m_nWindow == -1) { ASSERT_VALID(pFrame); // not yet counted (give it a 1 based number) pFrame->m_nWindow = ++nFrames; } } } // lastly walk the frames and update titles (assume same order) // go through frames updating the appropriate one int iFrame = 1; pos = GetFirstViewPosition(); while (pos != NULL) { CView* pView = GetNextView(pos); ASSERT_VALID(pView); ASSERT(::IsWindow(pView->m_hWnd)); if (pView->IsWindowVisible()) // Do not count invisible windows. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL && pFrame->m_nWindow == iFrame) { ASSERT_VALID(pFrame); if (nFrames == 1) pFrame->m_nWindow = 0; // the only one of its kind pFrame->OnUpdateFrameTitle(TRUE); iFrame++; } } } ASSERT(iFrame == nFrames + 1); }