dockable组件就是可以任意挪到四边上的组件。

example on web: http://www.codeguru.com/Csharp/Csharp/cs_syntax/controls/article.php/c5849/

这个例子有三个小组件都是继承了user control的,实际上,可以有更多. 三个都很有代表性:

1. Container(border control): 就是一个容器,可以用来放东东的。作为容器,被揪到四边时,形状会变化。一会儿长,一会儿扁。这就要保证里面的东西也要跟着调整才行。所以,这个user control的OnResize() 方法需要重写。

2.Title Bar (Docking handle):就是给人家揪着用的。鼠标放上去,按住不动,一揪就走。Drag的event可以在OnMouseMove事件中,检查this.capture属性。如果this.capture=ture, 就说明已经抓住了,可以跟着走了。根据当前鼠标的位置,设定dock的值。从横着变成竖着,这个title bar也得改改形状,所以要重写OnPaint事件。 愚蠢的微软为什么把这个窗口键放在Ctrl旁边,我中英文输入切换需要按Ctrl,动不动就按错了。一按错,就跳出个挺大的开始菜单,讨厌!将来有钱,买下微软,把windows拆成零件一个一个的买,内核换成linux!

3.splitter(dockingResize): 这是中间的splitter, 可以拖拉调整.和上一个一样,这个也需要重写OnMouseMove, 和 OnPaint方法。为了知道拉伸多远,还需要从OnMouseDown中,得到开始点的位置参数。

整体而言,很简单。但是细节很多,例如,纵横都要有splitter, 窗口要能够最小化,要响应双击事件, 拖动时,要给人家一个虚拟的框好确定位置, 还有最大化,最小化的抽屉动画效果,鼠标的形状,圆形边缘等等。 原理很简单,要做细,做好很不容易的。