1

CMyApp::Initintance() で LoadMDIState() を使用して、以前の MDI-Doc のウィンドウ位置をロード/復元します。

if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
{
    if (!pMainFrame->LoadMDIState(GetRegSectionPath()))
    {
        m_pStartDocTemplate->OpenDocumentFile(NULL);    // Load previous Document
    }
}

Serialize() 中の彼の内部状態がに設定されている場合に機能します

CMDIClientAreaWnd::m_bTabIsEnabled = FALSE;

しかし、息子の内部状態が

CMDIClientAreaWnd::m_bTabIsEnabled = TRUE;

MFC ソース コードでこのバグを調査したところ、再帰呼び出しが見られます。

void CMDIClientAreaWnd::EnableMDITabs(BOOL bEnable, const CMDITabInfo& params)
{
  if (m_bIsMDITabbedGroup)
  {
    EnableMDITabbedGroups(FALSE, params);
  }
  :
}


void CMDIClientAreaWnd::EnableMDITabbedGroups(BOOL bEnable, const CMDITabInfo& mdiTabParams)
{
  if (m_bTabIsEnabled)
  {
    EnableMDITabs(FALSE, mdiTabParams);
  }
  :
}

これはバグですか?また、MDI タブ付きビューでこの問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

MFC ソース コード自体のコメントによって解決されました。

CMDIChildWndEx* CMainFrame::CreateDocumentWindow(LPCTSTR lpcszDocName, CObject* pObj)
{
  return CMDIFrameWndEx::CreateDocumentWindow(lpcszDocName, pObj);
  ASSERT(FALSE);
  TRACE0("If you use save/load state for MDI tabs, you must override this method in a derived class!\n");
  return NULL;
}

CMainframe でこれをオーバーライドしましたが、動作します。

CMDIChildWndEx* CMainFrame::CreateDocumentWindow(LPCTSTR lpcszDocName, CObject* pObj)
{
    CDocument* pDoc = NULL;
    pDoc = AfxGetApp()->OpenDocumentFile(lpcszDocName);

    if (pDoc != NULL)
    {
        POSITION pos = pDoc->GetFirstViewPosition();

        if (pos != NULL)
        {
            CView* pView = pDoc->GetNextView(pos);
            return DYNAMIC_DOWNCAST(CMDIChildWndEx, pView->GetParent());
        }
    }
}

return NULL;
于 2016-09-26T14:23:43.237 に答える