MFC多文档界面(MDI)应用程序中,子框架中的停靠窗口CDockablePane状态保存

在主框架中,向导生成的几个停靠窗CDockablePane状态会自动保存,即在第二次打开时,停靠窗的大小和位置会和上次的状态一致,这对于使用者来说是非常友好的。但如果想在子框架中有自己的停靠窗且保存状态,就不是很容易了。经过研究,采用如下方法一定可以将子框架的停靠窗状态保存下来。

创建并显示停靠窗,在子框架的OnCreate函数中实现,和主框架相同,在此不在赘述。下面重点将子框架如何实现状态保存。

1、保存状态
有两个地方,一个是APP类中的虚函数SaveCustomState()中遍历所有子框架,对状态进行保存,保存在状态需要取不同的名字。
以下为参考例子:
void CProtocolTestToolsApp::SaveCustomState()
{
POSITION pos = theApp.pDocT_Protocol->GetFirstDocPosition();
while (pos != NULL)
{
CProtocolTestToolsDoc* pDoc = (CProtocolTestToolsDoc*)(theApp.pDocT_Protocol)->GetNextDoc(pos);
if (pDoc == NULL) break;
POSITION pos1 = pDoc->GetFirstViewPosition();
if (pos1 != NULL)
{
CProtocolTestToolsView* pView = (CProtocolTestToolsView*)pDoc->GetNextView(pos1);

	CChildFrame* pParent = (CChildFrame*)pView->GetParentFrame();
	if (pParent != NULL)
	{
		pParent->OnBtnStop();
		pParent->GetDockingManager()->SaveState(pParent->m_strInstName);
	}
}

}
另外一个需要在每个子框架的OnClose函数中也要保存状态
例如:
void CChildFrame::OnClose()
{
GetDockingManager()->SaveState(m_strInstName)
}
这个是在单独关闭子框架时调用,防止提前关闭的子框架没有保存状态。APP中的SaveCustomState只针对当前打开的子窗口的状态进行保存。

2、恢复状态
在打开子框架后,调用两个函数即可,例如:
GetDockingManager()->LoadState(pParent->m_strInstName);
GetDockingManager()->SetDockState();

每个子框架取一个名字,成员变量 m_strInstName,做为加载和保存的键值。
对于多个子框架,需要对整个名称进行管理,以保证加载到正确的子框架中,因为多个子框架中,每个子框架中的停靠窗的个数和内容可以完全不同。

以上为研究并实践后的干货,绝对可行。在VS2022中运行无误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值