VS2013/MFC 多文档程序CDockablePane实现对话框悬浮停靠
视图分割和窗口悬浮停靠是很多应用软件常用的技术。上一篇介绍了窗口分割,本文接着介绍一下对话框悬浮停靠。使用CDockablePane类。1.CDockablePane类CDockablePane是一个通用窗口容器,它主要有两个用途:1在一个框架中悬浮或者停靠窗口。2在复杂布局的应用程序中,它可以显示或隐藏所装载的窗口,为应用程序窗口提供额外的空间。要使用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)