Mfc 重置CDockablePane的布局
我迁移了我的MFC MDI应用程序以使用新的MFC功能包。我有很多工具栏和可固定的窗格。据我所知,它们的位置和大小在关闭应用程序时保存在注册表中,在加载主框架时加载 我想在应用程序中添加一项功能,将工具栏/窗格的布局重置为原始布局 我的应用程序中也有选项卡窗格 有时我会将单独的窗格停靠到选项卡式窗格 有没有办法在我的应用程序加载后重新设置它的布局 VisualStudio有一个类似的功能,称为“重置窗口布局” 我正在互联网上获取使用Mfc 重置CDockablePane的布局,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,我迁移了我的MFC MDI应用程序以使用新的MFC功能包。我有很多工具栏和可固定的窗格。据我所知,它们的位置和大小在关闭应用程序时保存在注册表中,在加载主框架时加载 我想在应用程序中添加一项功能,将工具栏/窗格的布局重置为原始布局 我的应用程序中也有选项卡窗格 有时我会将单独的窗格停靠到选项卡式窗格 有没有办法在我的应用程序加载后重新设置它的布局 VisualStudio有一个类似的功能,称为“重置窗口布局” 我正在互联网上获取使用SetWindowPlacement()和GetWindowPl
SetWindowPlacement()
和GetWindowPlacement()
恢复大型机窗口的示例
我不知道如何将这些功能用于工具栏和CDockablePanes
并达到我的要求
除了使用
SetWindowPlacement()
和GetWindowPlacement()
之外,还有其他解决方案吗?如我在上面的评论中所述,从运行的应用程序恢复初始布局的一个选项是使用
AttachToTabWindow
和DockToWindow
ShowPane
第二个选项需要重新启动应用程序,即调用派生类的构造函数。这将阻止加载存储的停靠状态,并因此恢复初始布局。解决此问题的简单方法是从注册表项中删除存储面板信息的所有键:“BasePane”和“Workspace”中的“Pane”应用程序注册表项中的注册表文件夹:)简单。我可以使用以下代码满足我的要求
void CMainFrame::OnPanesResetLayout()
{
CDockingManager* pDockMgr = GetDockingManager();
if (pDockMgr == NULL)return;
CRect rect;
rect.SetRectEmpty();
ClientToScreen(rect);
SetRedraw(FALSE);
CObList list;
pDockMgr->GetPaneList(list, TRUE,0,TRUE);
// UnDock and hide DockingControlBars
POSITION pos;
for (pos = list.GetHeadPosition(); pos != NULL;)
{
CBasePane* pBarNext = (CBasePane*) list.GetNext(pos);
if (!::IsWindow(pBarNext->m_hWnd))continue;
CDockablePane* pBar = DYNAMIC_DOWNCAST(CDockablePane, pBarNext);
if (pBar != NULL)
{
if(pBar->IsAutoHideMode()) pBar->SetAutoHideMode(FALSE, CBRS_ALIGN_ANY);/*ToggleAutoHide();*/
if (pBar->IsMDITabbed ())
continue;
pBar->UndockPane();
ShowPane(pBar, FALSE,FALSE, FALSE);
}
CMFCToolbar* pToolBar = DYNAMIC_DOWNCAST(CMFCToolbar, pBarNext);
if(pToolBar)
pToolBar->m_recentDockInfo.m_recentSliderInfo.m_rectDockedRect = rect;
}
m_wndBar1.DockToFrameWindow(CBRS_LEFT,m_wndBar1.GetAHRestoredRect());
ShowPane(m_wndBar1, TRUE,FALSE, FALSE);
m_wndBar2.DockToFrameWindow(CBRS_RIGHT,m_wndBar2.GetAHRestoredRect());
ShowPane(m_wndBar2, TRUE,FALSE, FALSE);
//for tabbed pane
CTabbedPane *pTabbedPane;
m_wndTab1.DockToFrameWindow(CBRS_BOTTOM,m_wndTab1.GetAHRestoredRect());
m_wndTab2.AttachToTabWnd(&m_wndTab1, DM_SHOW, FALSE,reinterpret_cast<CDockablePane**>(&pTabbedPane));
m_wndTab3.AttachToTabWnd(&m_wndTab1, DM_SHOW, FALSE,reinterpret_cast<CDockablePane**>(&pTabbedPane));
ShowPane(m_wndTab1, TRUE,FALSE, FALSE);
ShowPane(m_wndTab2, TRUE,FALSE, FALSE);
ShowPane(m_wndTab3, TRUE,FALSE, FALSE);
SetRedraw(TRUE);
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
AdjustClientArea();
}
void CMainFrame::OnPanesResetLayout()
{
CDockingManager*pDockMgr=GetDockingManager();
if(pDockMgr==NULL)返回;
正确无误;
SetRectEmpty();
ClientToScreen(rect);
设置重绘(假);
合作伙伴名单;
pDockMgr->GetPaneList(list,TRUE,0,TRUE);
//松开并隐藏停靠控制栏
位置pos;
对于(pos=list.GetHeadPosition();pos!=NULL;)
{
CBasePane*pBarNext=(CBasePane*)list.GetNext(pos);
如果(!::IsWindow(pBarNext->m_hWnd))继续;
CDockablePane*pBar=DYNAMIC_DOWNCAST(CDockablePane,pBarNext);
如果(pBar!=NULL)
{
如果(pBar->IsAutoHideMode())pBar->SetAutoHideMode(FALSE,CBRS_ALIGN_ANY);/*ToggleAutoHide()*/
if(pBar->ismditabed())
继续;
pBar->UndockPane();
显示窗格(pBar、FALSE、FALSE、FALSE);
}
CMFCToolbar*pToolBar=DYNAMIC_DOWNCAST(CMFCToolbar,pBarNext);
if(pToolBar)
pToolBar->m_recentDockInfo.m_recentSliderInfo.m_rectdockdrect=rect;
}
m_wndBar1.docktoframeewindow(CBRS_左,m_wndBar1.GetAHRestoredRect());
显示窗格(m_wndBar1,TRUE,FALSE,FALSE);
m_wndBar2.docktoframeewindow(CBRS_RIGHT,m_wndBar2.GetAHRestoredRect());
显示窗格(m_wndBar2,TRUE,FALSE,FALSE);
//用于选项卡式窗格
十六烷基四烷*PTABDEPANE;
m_wndTab1.docktoframeewindow(CBRS_BOTTOM,m_wndTab1.GetAHRestoredRect());
m_wndTab2.附件(m_wndTab1,DM_SHOW,FALSE,reinterpret_cast(&ptabedpane));
m_wndTab3.附件ToTabWnd(&m_wndTab1,DM_SHOW,FALSE,reinterpret_cast(&ptabedpane));
显示窗格(m_wndTab1,真,假,假);
显示窗格(m_wndTab2,真、假、假);
显示窗格(m_wndTab3,真、假、假);
SetRedraw(真);
重画窗口(NULL,NULL,RDW_无效| RDW_更新| RDW_擦除| RDW_所有子项);
调整客户区域();
}
查看CFullScreenImpl::ShowFullScreen
的代码可能是一个好的开始。您可以使用CDockablePane
方法恢复初始布局,例如AttachToTabWindow
,DockToWindow
,ShowPane
。。。或者在CMainFrameEx
的构造函数中调用EnableLoadDockState(FALSE)
(后者需要重新启动应用程序)来阻止加载存储的布局。sergiol和fhe,感谢您的建议。它帮助了我,并且能够达到我的要求。