如何在C ++ MFC中使用EnableMDITabbedGroups时保留文档选项卡顺序

时间:2017-02-27 20:08:25

标签: c++ visual-studio-2010 tabs mfc

VS2010带有MDI文档布局,使用顶部的选项卡在文档之间切换。每个文件都是" live"查看数据库,其中每个文档的持久数据是一组配置设置。

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

我们正在使用EnableMDITabbedGroups(TRUE, mdiTabParams) m_bEnableTabSwap = TRUE,这是默认设置。

2 个答案:

答案 0 :(得分:2)

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

要访问标签控件,请使用CMDIClientAreaWnd::GetMDITab

答案 1 :(得分:2)

谢谢!在MainFrame :: OnClose()方法中使用以下解决方案。

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

如果有多个组窗口打开,此代码解决方案还会实现GetMDITabGroup。

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();
}