CDockablePane使用心得

 

一、排版多个可停靠窗口

(转自:https://blog.csdn.net/kikaylee/article/details/8936953

 

1. CFrameWndEx  在框架类的头文件中定义一个CDockablePane的数组

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

 

2. CFrameWndEx:: OnCreate() 在Create函数中自动生成了一下代码,对MFC比较熟悉的这里就不讲了

CMFCPopupMenu::SetForceMenuFocus(FALSE);

InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);

EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, 0, ID_VIEW_TOOLBAR);

CDockingManager::SetDockingMode(DT_SMART);

EnableAutoHidePanes(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

(1) 第一种情况

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;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

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

(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

(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_BOTTOM | 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]);// BOTTOM

(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;}

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

(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_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

CDockablePane* pTabbedBar = NULL;

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

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

(6)第六种情况

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

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

CDockablePane* pTabbedBar = NULL;

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

(7)第七种情况

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;}

m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

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

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

CDockablePane* pTabbedBar = NULL;

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

(8)第八种情况

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

(9)第九种情况

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[1].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

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

二、几点问题小结

(转自:https://www.xuebuyuan.com/2089010.html

问题一:可停靠窗口在左上角显示 没有停靠到指定位置

这几天在调Docablepane 可停靠窗口VC++ 2010,遇到这个如题问题。

目前接触到的原因:

1、DockPane(&m_yourPane);//未调用,或未执行

2、//并且注意在m_yourPane.Create( 中创建风格处指定 | WS_VISIBLE);

内部运行原理原因没分析出来,估计与Cpane的SetWindowPos 函数处调用有问题。感兴趣可调试Mfc源代码

 

问题二:消除停靠位置,存储记忆功能

在CMainFrame中,CreateDocablePane之前,调用CMainFrame::EnableLoadDockState(FALSE);

 

问题三:去掉停靠窗口右上角关闭按钮

m_ourPane.SetControlBarStyle(~AFX_CBRS_CLOSE)

 

问题四:如何指定可停靠位置

1、在创建时,风格参数中 CBRS_BOTTOM \CBRS_LEFT ... 等指定初始显示的位置

2、创建后可调用   m_pane.EnableDocking(CBRS_ALIGN_ANY/*任意位置*/); CBRS_ALIGN_LEFT,  BOTTOM 等 指定可停靠在Frame中的位置 

注意,当指定dcoapane的控制条某些属性(SetControlBarStyle(AFX_CBRS_RESIZE))后,用户则无法拖动该可停靠窗口

 

问题五:如何禁止用户拖动可停靠窗口 

m_pane.SetControlBarStyle(AFX_CBRS_RESIZE);

 

问题六:如何创建多功能停靠窗口,以及如和销毁可停靠窗口,以及使用

参见:http://www.codeproject.com/Articles/493218/Understanding-CDockablePane

个人觉得普通显示关闭,没必要像codeProject这位,每次都去创建销毁可停靠窗口来进行显示或隐藏,建议使用成员函数的方式,进行m_pane.ShowWindow(SW_HIDE /*SW_SHOW*/)及可。

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值