基于 http://blog.csdn.net/kikaylee/article/details/8936953

CDockablePane的基本布局和用法

新建一个SDI工程,在CMainFrame类中添加一个CDockablePane数组:

CDockablePane m_Panes[5];// 一个CDockablePane的数组

CMainFrame:: OnCreate() 函数中自动生成了以下代码:

// 启用 Visual Studio 2005 样式停靠窗口行为

CDockingManager::SetDockingMode(DT_SMART);

// 启?用 Visual Studio 2005 样式停靠窗口自动隐藏行为

EnableAutoHidePanes(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

以下添加代码位于该段代码之后。

1.1  第一种情况

//添加CDockablePane

if(!m_Panes[0].Create("Pane 0",this,CRect(0,0,200,100),TRUE,1000,

WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_ALIGN_BOTTOM|CBRS_FLOAT_MULTI))

{ return FALSE;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_Panes[0]);// LEFT

1.2  第二种情况

if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))

{return FALSE;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_Panes[1]);// BOTTOM,优先占满底部窗口,左侧窗口只能占一部分

DockPane(&m_Panes[0]);// LEFT

代码中先停靠的Pane会优先占满一侧的窗口。但是如果手动调整过Pane的位置,程序启动时会读取最近一侧程序关闭时各Pane的停靠位置,就是所谓的记忆界面布局。为了看到代码的设置效果,可以将程序在注册表中的信息删除,然后编译运行程序。使用VS调试代码时,项目的信息存储位置为:

HKEY_CURRENT_USER\SoftWare\应用程序向导生成的本地应用程序\projectName

需要注意的是,不同的CDockablePane调用Create函数时,其UID值必须不同,因为程序关闭后重新启动时,会去注册表读取界面布局信息,不同pane的位置信息与其UID值相关联,如果两个Pane的UID值相同,就有可能报错。MSDN:Specifies the ID of the child window. This value must be unique if you want to save docking state for this docking pane.

1.3  第三种情况

if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_Panes[0]);// LEFT

DockPane(&m_Panes[1]);// LEFT

// 注意这里,将0放在1上面

m_Panes[0].DockToWindow(&m_Panes[1], CBRS_TOP);

1.4  第四种情况

if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[2].Create(_T("Pane 2"), this, CRect(0, 0, 200, 100), TRUE, 1002,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[2].EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_Panes[0]);// LEFT

DockPane(&m_Panes[1]);// LEFT

DockPane(&m_Panes[2]);// LEFT

CDockablePane* pTabbedBar = NULL;

// 放到同一个选项卡中,并默认选择1

m_Panes[1].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

// 放到同一个选项卡中,并默认选择2

m_Panes[2].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

或者

// 放到同一个选项卡中,并默认选择1

m_Panes[1].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

CDockablePane* pTabbedBar1 = NULL;

// 放到同一个选项卡中,并默认选择2

m_Panes[2].AttachToTabWnd(pTabbledBar,DM_SHOW,TRUE,&pTabbledBar1);

1.5  第五种情况

if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[2].Create(_T("Pane 2"), this, CRect(0, 0, 200, 100), TRUE, 1002,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[3].Create(_T("Pane 3"), this, CRect(0, 0, 200, 100), TRUE, 1003,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

{return FALSE;}

if (!m_Panes[4].Create(_T("Pane 4"), this, CRect(0, 0, 200, 100), TRUE, 1004,

WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))

{return FALSE;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[2].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[3].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[4].EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_Panes[0]);// BOTTOM

DockPane(&m_Panes[1]);// BOTTOM

DockPane(&m_Panes[2]);// LEFT

DockPane(&m_Panes[3]);// LEFT

DockPane(&m_Panes[4]);// RIGHT

CDockablePane* pTabbedBar = NULL;

m_Panes[0].DockToWindow(&m_Panes[1], CBRS_LEFT);

m_Panes[3].AttachToTabWnd(&m_Panes[2], DM_SHOW, TRUE, &pTabbedBar);

CDockablePane使用总结的更多相关文章

  1. 在CDockablePane中嵌入CFormView

    CDockablePane中嵌入CFormView与嵌入CDialogEx稍有不同,差异主要体现在CFormView类本身与CDialogEx类的不同上,CDockablePane层面的操作完全相同. ...

  2. 在CDockablePane中嵌入对话框

    CDockablePane类可以用来创建停靠栏.可以将其他控件集成到CDockablePane的派生类中.下文描述如何将对话框集成到CDockablePane中. a)      创建单文档应用程序: ...

  3. CDockablePane 关闭的问题

    显示或者隐藏 当点击CDockablePane上的关闭按钮时,并不能将其关闭,知识将其隐藏了起来,如果需要重新显示或隐藏,则相关命令的响应函数如下: if(m_Panes.GetSafeHwnd()) ...

  4. CDockablepane风格设置

    屏蔽掉pane右上角的几个按钮 即将CDockablePane右上角的三个按钮屏蔽. 1            去掉关闭按钮 在CDockablePane的派生类中,重写方法CanBeClosed即可 ...

  5. MFC停靠窗口实现(CDockablePane)

    工作中编写MFC界面程序时用到了停靠窗口,为了避免之后用到时再去查询,这里记录下. 步骤 1.定义一个继承自CDockablePane的类 Class CDockableTest : public C ...

  6. 测试CDockablePane。 测试他的最基本的功能。

    最近看到一句话: ××××××××××××××××××××××××××××××××××××××××××× CDockablePane是一个通用窗口容器,它主要有两个用途:在一个框架中悬浮或者停靠窗口. ...

  7. CCoolBar 的替代方案 CDockablePane。

    (阅读受众需有一定MFC知识储备.) (技术支持:http://www.cnblogs.com/shuhaoc/archive/2011/06/26/cdockableform.html) 在以往很多 ...

  8. VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)

    VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...

  9. CDockablePane 记忆界面布局的问题

    CWinAppEx类的LoadCustomState()和SaveCustomState()用于向注册表读取和保存应用程序的界面信息,重载该方法可以取消自动记忆界面布局. void CxxxApp:: ...

随机推荐

  1. POJ 2039 To and Fro

    To and Fro Description Mo and Larry have devised a way of encrypting messages. They first decide sec ...

  2. 仿bootstrap的

    <!doctype html> <html class="no-js"> <head> <meta charset="utf-8 ...

  3. 洛谷-ISBN号码-简单字符串

    题目描述 Description 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符 ...

  4. 关于MTK平台SIM-ME Lock的配置方案

    针对一些运营商的锁网需求,MTK平台已经对其有很好的支持.绝大多数的海外需求可以通过直接配置相关文件来完成.这里简单描述一下配置方法,不做原理分析. 相关数据结构分析: Modem中与SML锁网配置相 ...

  5. windows 查 mac

    各位,登记一下新电脑 序列号 和 MAC,麻烦大家私信发给我.1.序列号在主机有标签,类似 "Servial NO.   4CV5149L2H"2.MAC,按<“开始”+r  ...

  6. sql存储过程——名称 ****不是有效的标识符

    转载自http://blog.csdn.net/xb12369/article/details/8202703 假设存储过程:proc_test create proc proc_test @Prod ...

  7. 3. JavaScript 数据类型

    1. 主要类型 字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null).未定义(Undefined). JavaScript 拥 ...

  8. C# 中的局部static变量

    其实这问题没什么可讨论的,C#不支持局部静态变量. 但还是想了一下C#为什么不支持局部静态变量,以下均是个人想法. C++和C支持局部静态变量,也就是在一个函数的内部声明一个静态变量,这种变量的特定如 ...

  9. jquery各版本区别

     jquery版本区别:          1.3一般功能够 1.4.2一般功能够而且稳定 1.7+比较新特性 2不支持老IE 兼容的话最好选 1.x.稳定性就用1.7或者1.4,其中1.4的体积相对 ...

  10. c语言-经验之谈

    如果你是一个大牛,那就直接忽略这里. 如果你是一个新手,请继续向下看. 在自学计算机的路上真的很悲惨,如果你是在学校里面学习还算比较幸运. 针对编程来说,在学校里面学习的只是学会了语言,而很少有人学会 ...