【问题标题】:Bug in CMDIClientAreaWnd::EnableMDITabs()? recursive callCMDIClientAreaWnd::EnableMDITabs() 中的错误?递归调用
【发布时间】:2016-09-26 13:22:40
【问题描述】:

我在 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 选项卡视图的这个问题?

【问题讨论】:

    标签: mfc docview


    【解决方案1】:

    通过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;
    

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2015-04-15
      • 1970-01-01
      • 2019-09-07
      • 2018-12-15
      • 1970-01-01
      • 2023-03-13
      • 2016-10-26
      • 2016-06-05
      相关资源
      最近更新 更多