2017-02-27 53 views
1

MD20ドキュメントレイアウトを使用するVS2010では、上部にタブを使用してドキュメントを切り替えることができます。各ドキュメントはデータベースへの「ライブ」ビューであり、ドキュメントごとの永続データは構成設定のグループです。C++ MFCでEnableMDITabbedGroupsを使用するときにドキュメントタブの順序を維持する方法

ユーザーはタブを並べ替えることができます(この機能は組み込まれていますが、この新しい注文を維持する必要があります)。今、ドキュメントのzオーダーは、タブを動かすことによって影響を受けていないようです。アプリを閉じるときに、開いた順にドキュメントが閉じるので、閉じるときに最後のタブ順序を決定するのに役立ちません。

EnableMDITabbedGroups(TRUE, mdiTabParams)は、デフォルトのm_bEnableTabSwap = TRUEで使用しています。

答えて

2

ありがとうございます! MainFrame :: OnClose()メソッドで次の解決策を終了しました。

このコード例では、1)CViewから継承するCSpectraAnalysisUtilityViewと、最近のタブオーダーの更新に必要なオブジェクトである2)CReviewDataFolderという2つのカスタムクラスを使用しています。

このコードソリューションは、複数のグループウィンドウが開いている場合に備えて、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を使用します。

関連する問題