2017-02-27 253 views
1

带有MDI文档布局的VS2010使用沿顶部的选项卡在文档之间切换。每个文档都是数据库的“实时”视图,每个文档的持久数据是一组配置设置。如何在C++ MFC中使用EnableMDITabbedGroups时保留文档选项卡顺序

我们希望允许用户重新排列选项卡(此功能是内置的),但需要坚持这个新的顺序。现在看来,文档z顺序不受移动标签周围的影响。当关闭应用程序时,文档按打开的顺序关闭,因此这对确定最终的标签顺序没有帮助。

我们使用EnableMDITabbedGroups(TRUE, mdiTabParams)m_bEnableTabSwap = TRUE这是默认值。

回答

2

谢谢!在MainFrame :: OnClose()方法中结束了以下解决方案。

请注意,此代码示例使用两个自定义类1)CSpectraAnalysisUtilityView,它继承自CView和2)CReviewDataFolder,它是我们需要更新最近的Tab顺序的对象。

此代码解决方案还实现了GetMDITabGroups,以防打开多个组窗口。

void CMainFrame::OnClose() 
{ 
    iReviewDataFolderOrder = 1; 

    const CObList& tabGroups =m_wndClientArea.GetMDITabGroups(); 
    if (0 < tabGroups.GetCount()) 
    { 
     POSITION pos = tabGroups.GetHeadPosition(); 
     CMFCTabCtrl* pCrtTabCtrl; 

     while(pos != NULL) 
     { 
      pCrtTabCtrl=DYNAMIC_DOWNCAST(CMFCTabCtrl, tabGroups.GetNext(pos)); 

      int count = pCrtTabCtrl->GetTabsNum(); 
      for(int i = 0; i < count; i++) 
      { 
       CWnd* pWnd = pCrtTabCtrl->GetTabWndNoWrapper(i); 
       CMDIChildWnd *pChild = ((CMDIChildWnd*)(pWnd)); 
       if (pChild) 
       { 
        CView *pView = pChild->GetActiveView(); 
        if (pView) 
        { 
         if (pView->IsKindOf(RUNTIME_CLASS(CSpectraAnalysisUtilityView))) 
         { 
          CSpectraAnalysisUtilityView* specUtilView; 

          specUtilView = (CSpectraAnalysisUtilityView*)pView; 
          CReviewDataFolder* pDataFolder = specUtilView->GetSpecReviewDataFolder(); 
          if(pDataFolder) 
          { 
           pDataFolder->SetRecentOrder(iReviewDataFolderOrder); 
           iReviewDataFolderOrder++; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    CMDIFrameWnd::OnClose(); 
} 
2

破坏外部主框架(OnDestroy)后,您可以访问CMFCTabCtrl成员,并可以遍历每个选项卡并确定存储在选项卡中的当前序列。 GetTabWnd将允许您通过其索引访问每个选项卡。

要访问选项卡控件,请使用CMDIClientAreaWnd::GetMDITab

相关问题