CDockablePane使用总结

基于 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);

posted @ 2014-12-10 22:42  canger  阅读(6086)  评论(0编辑  收藏  举报