VS2013/MFC 多文档程序CDockablePane实现对话框悬浮停靠

视图分割和窗口悬浮停靠是很多应用软件常用的技术。上一篇介绍了窗口分割,本文接着介绍一下对话框悬浮停靠。使用CDockablePane类。

1.CDockablePane类

CDockablePane是一个通用窗口容器,它主要有两个用途:1在一个框架中悬浮或者停靠窗口。2在复杂布局的应用程序中,它可以显示或隐藏所装载的窗口,为应用程序窗口提供额外的空间。

要使用CDockablePane,首先从CDockablePane派生出你自己的类,然后必须处理它的OnCreate() 和 OnSize()事件,最后添加一个子窗口成员变量。

注意:CDockablePane类位于CMDIFrameWndEx基类中,所以在利用应用程序向导生成多文档的时候要做一些修改,具体步骤如下:

 

2.多文档程序实现对话框停靠

1)新建多文档程序,项目名称dockTest,生成CAboutDlg、CChildFrame、CMainFrame、CdockTestApp、CdockTestDoc和CdockTestView 6个默认的类。运行结果如下:

 2)在“资源视图”中添加对话框资源,对话框ID为CG-IDD-AI-OPT,在属性中设置Style为“Child”,Border为“None”。结果如下:

3)为上述对话框新建一个类,类名为CAIOpt,基类CDialog,如下图所示。

 4)基于CDockablePane派生出自己的类CMypane,类视图中点击项目名称“dockPane”右键“添加”->“类”,选择添加MFC类,如下图所示:

5)类视图中,右键“CMypane”选择“类向导”,添加消息处理函数OnCreate和OnSize,添加私有成员变量CAIOpt m_AIOptDlg,同时在Mypane.h中添加头文件#include "AIOpt.h"。如下图所示:

6)在OnCreate和OnSize函数中添加如下代码:

在Mypane.cpp中添加头文件#include "AIOpt.h"

int CMypane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	CRect rectDummy;
	rectDummy.SetRectEmpty();
	// 创建选项卡窗口:
	if (!m_AIOptDlg.Create(CG_IDD_AI_OPT, this))

	{
		TRACE0("未能创建输出选项卡窗口/n");
		return -1;      //未能创建
	}
	m_AIOptDlg.ShowWindow(SW_SHOW);

	return 0;
}
void CMypane::OnSize(UINT nType, int cx, int cy)
{
	CDockablePane::OnSize(nType, cx, cy);

	// TODO:  在此处添加消息处理程序代码
	m_AIOptDlg.SetWindowPos(this, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
	m_AIOptDlg.ShowWindow(SW_SHOW);
}

7)在类CMainFrame中右键类向导添加是有成员变量CMypane m_MyPane, 在OnCreate函数中添加如下代码(同样要在MainFrm.h和MainFrm.cpp中添加头文件#include "Mypane.h"):

	if (!m_MyPane.Create(_T("MyPane"), this, CRect(0, 0, 1000, 50), TRUE, CG_IDD_AI_OPT,
		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_TOP | CBRS_FLOAT_MULTI))
	{
		TRACE0("未能创建自定义窗口/n");
		return FALSE;
	}
	//m_MyPane.SetControlBarStyle(m_MyPane.GetControlBarStyle() | CBRS_TOP | CBRS_SIZE_DYNAMIC);
	m_MyPane.EnableDocking(CBRS_ALIGN_ANY);
	DockPane(&m_MyPane);

结果如下:

还有一些问题:创建的浮动窗口,可以更改他的位置,但是下次再运行程序就会保持上次停靠的位置,没有停靠在初始位置。 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现MFC文档应用程序中保存当前所有对话框的操作,并在退出程序后重新启动时恢复,您可以按照以下步骤进行操作: 1. 在文档类中添加成员变量来存储对话框的状态。例如,您可以使用一个 `std::vector` 来存储对话框指针。 ```cpp class CMyDoc : public CDocument { public: std::vector<CDialog*> m_dialogs; // 存储对话框的指针 // ... }; ``` 2. 在文档类的 `Serialize` 函数中保存和加载对话框的状态。将对话框指针存储到存档中。 ```cpp void CMyDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // 保存对话框的状态 int numDialogs = m_dialogs.size(); ar << numDialogs; for (int i = 0; i < numDialogs; i++) { if (m_dialogs[i] != nullptr) { ar << m_dialogs[i]->GetRuntimeClass()->m_lpszClassName; // 保存对话框类名 m_dialogs[i]->Serialize(ar); // 保存对话框状态 } } } else { // 加载对话框的状态 int numDialogs; ar >> numDialogs; for (int i = 0; i < numDialogs; i++) { CString dialogClassName; ar >> dialogClassName; // 加载对话框类名 // 根据对话框类名创建对话框实例 CRuntimeClass* pRuntimeClass = CRuntimeClass::FromName(dialogClassName); if (pRuntimeClass != nullptr) { CDialog* pDialog = (CDialog*)pRuntimeClass->CreateObject(); if (pDialog != nullptr) { m_dialogs.push_back(pDialog); pDialog->Serialize(ar); // 加载对话框状态 } } } } } ``` 3. 在主框架类的 `InitInstance` 函数中恢复对话框的状态。在创建文档后,将保存的对话框状态恢复。 ```cpp BOOL CMyApp::InitInstance() { // ... // 创建文档 AddDocTemplate(new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CMyView))); // ... if (pDoc != nullptr) { // 恢复对话框的状态 int numDialogs = pDoc->m_dialogs.size(); for (int i = 0; i < numDialogs; i++) { if (pDoc->m_dialogs[i] != nullptr) { pDoc->m_dialogs[i]->Create(pDoc); // 创建对话框 pDoc->m_dialogs[i]->ShowWindow(SW_SHOW); // 显示对话框 } } } // ... } ``` 通过以上步骤,您可以在 MFC文档应用程序中保存当前所有对话框的状态,并在退出程序后重新启动时恢复。请注意,对话框类必须正确实现 `Serialize` 函数以保存和加载其状态。 希望这对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值