在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档 Tab 键顺序

Posted

技术标签:

【中文标题】在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档 Tab 键顺序【英文标题】:How to persist document tab order when using EnableMDITabbedGroups in C++ MFC 【发布时间】:2017-02-27 20:08:24 【问题描述】:

带有 MDI 文档布局的 VS2010 使用顶部的选项卡在文档之间切换。每个文档都是数据库的“实时”视图,其中每个文档的持久数据是一组配置设置。

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

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

【问题讨论】:

【参考方案1】:

谢谢!最终在 MainFrame::OnClose() 方法中得到以下解决方案。

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

此代码解决方案还实现了 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

【讨论】:

以上是关于在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档 Tab 键顺序的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 将 Hunspell 与 MFC 一起使用

c++ MFC访问多个文件

在 C++ MFC 程序中使用 mysql 查询中的变量

在 MFC C++ 中打开对话框

如何在 C++ 语言中将谷歌地图 API 与 MFC 或 QT 一起使用?

在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档 Tab 键顺序