2017-02-27 80 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

相關問題