您的位置:首页 > 其它

MFC创建可停靠与浮动窗口

2017-03-27 20:55 323 查看

MFC创建可停靠与浮动窗口

可浮动和可停靠的窗口类似与VS2008  IDE界面里的属性窗口,工程管理窗口,输出窗口等等。研究了好长时间,发现VS2008 SP1版本以及上才有一个叫做CDockablePane的类,可以建立这样的窗口。而且调试了好久才发现使用这个类的话主框架必须是CFrameEx的派生类而不是CFrame。(后者debug会出现莫名的中断)。而且要在stdafx.h下include上

#include <afxcontrolbars.h>    
// 功能区和控件条的MFC
支持

这两个问题让我纠结了好几天才发现的问题,也是被折腾得够够的了。

本笔记实现两种可浮动与停靠窗口:一种是点击按钮弹出的,另一种是嵌在分割后的View里的。

一、           点击按钮弹出的。

1.     在工程里新建一个类。该类继承于CDockablePane——CPaneTest1。

2.     这个CDockablePane类是没有资源的,所以需要再创建一个Dialog类——CDlgTest1.一定要注意须将此类对应的资源IDD_DLGTEST1的属性修改为Border无边框和Style为child。

3.     将这个Dlg绑定到建立的Panel中。打开PaneRCS.h文件,添加:

#include "DlgTest1.h"
CDlgTest1 m_Dlg;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType,int cx, int cy);
4.     打开PaneRCS.cpp文件添加两个消息映射,创建dlg并修改其尺寸

ON_WM_CREATE()
ON_WM_SIZE()
5.     编写这两个消息响应函数:

int CPaneTest1::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct)== -1)
return -1;
CRect rectDummy;
rectDummy.SetRectEmpty();
// 创建选项卡窗口:
if (!m_Dlg.Create(IDD_DLGTEST1,this))
{
TRACE0("未能创建输出选项卡窗口\n");
return -1; // 未能创建
}
m_Dlg.ShowWindow(SW_SHOW);
return 0;
}
void CPaneTest1::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);

// 选项卡控件应覆盖整个工作区:
m_Dlg.SetWindowPos(NULL, -1, -1, cx,cy, SWP_NOMOVE| SWP_NOACTIVATE | SWP_NOZORDER);
}
6.     在MainFrame.h文件里#include "PaneTest1.h"并定义CPaneTest1
m_Pane;

7.     点击资源下的Menu,右键视图添加ID和响应事件。如若不能添加响应事件,修改该属性为Popup为True。添加事件的类选在MainFrame中。在生成的函数里编写创建该Panel的代码:

void CMainFrame::OnShowPane()
{
// TODO: 在此添加命令处理程序代码
if (!m_Pane.Create(_T("MyPane"), this,CRect(0, 0, 500, 150), TRUE, IDD_DLGTEST1,WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS | WS_CLIPCHILDREN| CBRS_BOTTOM | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建输出窗口\n");
return ; // 未能创建
}
m_Pane.EnableDocking(CBRS_ALIGN_ANY);//使能停靠
DockPane(&m_Pane);//停靠该窗口
}
其中的CBRS_BOTTOM定义了初始化时在底端停靠。同样还有RIGHT LEFT等。

8.     在MainFrame中还需添加Oncreate()函数,以实现该窗口的停靠和浮动。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// TODO: 在此添加命令处理程序代码
if (CFrameWndEx::OnCreate(lpCreateStruct)== -1)
return -1;

//启用VisualStudio 2005 样式停靠窗口行为
CDockingManager::SetDockingMode(DT_SMART);
//启用VisualStudio 2005 样式停靠窗口自动隐藏行为
EnableAutoHidePanes(CBRS_ALIGN_ANY);
return 0;
}
二、    嵌在View里的可浮动/停靠窗口

1.     同样需要首先建立一个CDockablePane类和一个CDlg类。这里对应的对象为PPIC。同样在Panel中将dlgPPIC创建和初始化size。

2.     在View.h中添加相关声明:

#include "PaneTest2.h"
CPanePPIC m_Pane2;
afx_msg int OnCreate(LPCREATESTRUCT lpcs);
afx_msg void OnSize(UINT nType, int cx, int cy);
3.     在View.cpp里添加消息映射,并实现该函数:

ON_WM_CREATE()
ON_WM_SIZE()
int CView1::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// TODO: 在此添加命令处理程序代码
if (CView::OnCreate(lpCreateStruct)== -1)
return -1;

// 启用VisualStudio 2005 样式停靠窗口行为
CDockingManager::SetDockingMode(DT_SMART);
if (!m_Pane2.Create(_T("MyPane2"), this, CRect(0, 0,500, 500), TRUE, IDD_DLGPPIC,WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS | WS_CLIPCHILDREN| CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建输出窗口\n");
return FALSE; // 未能创建
}
m_Pane2.EnableDocking(CBRS_ALIGN_ANY);
return 0;
}
void CView1::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// 选项卡控件应覆盖整个工作区:
m_Pane2.SetWindowPos(NULL, -1, -1, cx,cy, SWP_NOMOVE| SWP_NOACTIVATE | SWP_NOZORDER);
}

PS:之后可以在建立的Dlg上添加一些控件。在Dlg的下添加上篇笔记中的easysize,可以实现整个窗口的整体按比例缩放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: