MFC 中的停靠栏

设置停靠功能
1、CFrameWnd::EnableDocking()该函数创建停靠栏。
2、CControlBar::EnableDocking()该函数向控制条中增加停靠和移动功能。
3、CFrameWnd::DockControlBar()该函数将控制条停靠到停靠栏。

CToolBar工具条
CStatusBar状态条
CDockBar停靠栏
CToolBar、CStatusBar类允许控制条和视类共享客户区以及许多其他功能。
CDockBar和CDockContext类允许用户移动其工具栏。
CMiniDockFrameWnd类则可以使用户浮动它们的工具栏。

停靠控制条采用了两种MFC类以及4个函数:
1)CDockBar类沿应用程序的主窗口四周,创建至多4个停靠栏以控制和包含其他控制条。如果停靠栏没有包含其他控制条,它就将自身缩小到看起来仿佛已经从应用程序中消失,然后等待新的控制条放置在自己上面。
2)CDockContext类处理用户鼠标单击并拖动控制条于停靠栏上这一事件,该类通过CControlBar::EnableDocking()函数为控制条创建。
3)CFrameWnd的EnableDocking()函数为窗口的每一边创建CDockBar的实例。
4)CControlBar的EnableDocking()函数创建一个CDockContext实例以允许控制条处理用户鼠标输入移动或者停靠其控制条等事件。
5)CFrameWnd的DockControlBar()函数确定将控制条停靠到哪个停靠栏。
6)CDockBar的DockControlBar()函数用于停靠栏控制其上的控制条。

应用程序主窗口中的控制条如何互相共享客户区:
1)当窗口上的内容改变时,CFrameWnd的RecalcLayout()函数即被调用。
2)RecalcLayout()随后调用CWnd的RepositionBars()函数并告诉它允许窗口中所有的控制条占用其所需空间,然后将剩余空间留给客户区。
3)RepositionBars()遍历窗口中的所有子窗口并向它们发送WM_SIZEPARENT消息来完成这项工作。它给框架中每个还可见的控制条传递给一个逐渐缩小的矩形区域。
4)CControlBar的OnSizeParent()消息处理器为所有的控制条类型处理WM_SIZEPARENT消息,它采取的方式是询问控制条它们需要多大的空间并随后从可用空间中将它们所需的空间减去。
5)OnSizeParent()通过调用CalcDynamicLayout()函数计算出其控制条所需的空间,这个函数被每个基于不同类型的控制条重载以确定这个所需的尺寸。
6)停靠栏在返回请求尺寸之前为自己完成一点布局工作。

存储:
CFrameWnd类在一个名为m_listControlBars的指针链表里为它所创建的每个CDockBar实例存储了一个指针
CDockBar类在一个名为m_arrBars的指针链表里为每个停靠在当前停靠栏中的控件条(工具条、状态条等)存储了一个指针

class CDockBar:publicCControlBar
{
    CPtrArray m_arrBars; //each element is a CControlBar
};

class CFrameWnd : public CWnd
{
   CPtrList m_listControlBars; // array of all control bars that have this window as their dock site
};

CDialogBar的使用:

CDockBar只是用来包容停靠在它内部的ControlBar的。

若要在停靠栏中停靠一些组件,如VS中的工具栏、信息提示栏,直接往CDockBar上加是不行的。
比较省事的办法是利用CDialogBar,把控件加到对话框模板里,再停靠就成了。

入门参见:

http://blog.csdn.net/fulingwei/archive/2007/05/30/1630444.aspx

http://topic.csdn.net/t/20040614/16/3090805.html

 

如何实现一个MSDN那样的停靠栏,可以参考:

http://www.vckbase.com/document/viewdoc/?id=257

http://www.vckbase.net/document/viewdoc/?id=1059

http://www.vckbase.net/document/viewdoc/?id=1074

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值