在 C++ MFC 中使用 EnableMDITabbedGroups 时如何保持文档选项卡顺序
How to persist document tab order when using EnableMDITabbedGroups in C++ MFC
VS2010 具有 MDI 文档布局,使用顶部的选项卡在文档之间切换。每个文档都是数据库的 "live" 视图,其中每个文档的持久数据是一组配置设置。
我们希望允许用户重新排列选项卡(此功能是内置的),但需要保留此新顺序。现在看来文档的 z 顺序不受移动选项卡的影响。关闭应用程序时,文档按打开顺序关闭,因此这对确定关闭时的最终 Tab 键顺序没有帮助。
我们使用 EnableMDITabbedGroups(TRUE, mdiTabParams)
和 m_bEnableTabSwap = TRUE
,这是默认值。
在破坏外部主框架 (OnDestroy
) 后,您可以访问 CMFCTabCtrl
成员并可以遍历每个选项卡并确定选项卡中存储的当前序列。 GetTabWnd
将允许您通过索引访问每个选项卡。
要访问选项卡控件,请使用 CMDIClientAreaWnd::GetMDITab
。
谢谢!在 MainFrame::OnClose() 方法中得到以下解决方案。
请注意,此代码示例使用两个自定义 类:1) 从 CView 继承的 CSpectraAnalysisUtilityView 和 2) CReviewDataFolder,这是我们需要更新最近的 Tab 顺序的对象。
此代码解决方案还实现了 GetMDITabGroups,以防有多个组 windows 打开。
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();
}
VS2010 具有 MDI 文档布局,使用顶部的选项卡在文档之间切换。每个文档都是数据库的 "live" 视图,其中每个文档的持久数据是一组配置设置。
我们希望允许用户重新排列选项卡(此功能是内置的),但需要保留此新顺序。现在看来文档的 z 顺序不受移动选项卡的影响。关闭应用程序时,文档按打开顺序关闭,因此这对确定关闭时的最终 Tab 键顺序没有帮助。
我们使用 EnableMDITabbedGroups(TRUE, mdiTabParams)
和 m_bEnableTabSwap = TRUE
,这是默认值。
在破坏外部主框架 (OnDestroy
) 后,您可以访问 CMFCTabCtrl
成员并可以遍历每个选项卡并确定选项卡中存储的当前序列。 GetTabWnd
将允许您通过索引访问每个选项卡。
要访问选项卡控件,请使用 CMDIClientAreaWnd::GetMDITab
。
谢谢!在 MainFrame::OnClose() 方法中得到以下解决方案。
请注意,此代码示例使用两个自定义 类:1) 从 CView 继承的 CSpectraAnalysisUtilityView 和 2) CReviewDataFolder,这是我们需要更新最近的 Tab 顺序的对象。
此代码解决方案还实现了 GetMDITabGroups,以防有多个组 windows 打开。
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();
}