Fool's Garden

Talking about Windows Mobile and Embedded gadgets...Web counter

导航

Locking the splitter bar

Posted on 2004-09-14 19:29  Levins Dai  阅读(808)  评论(0)    收藏  举报

MFC的CSplitterWnd可以方便的实现划分窗口,但是有的时候,我们需要让分割条锁定,禁止用户拖放和随意改变分割窗口的大小,CSplitterWnd并没有提供直接的函数或方法可以方便实现这个功能。CodeProject上有篇文章讨论了这个问题,但遗憾的是,它的实现只能锁住所有的Splitter Bar,而无法单独锁住某个Bar。

研究了一番CSplitterWnd的源码,发现一个函数是非常有用,那就是HitTest(...),用于判断当前鼠标的位置,它的返回值如下:

enum HitTestValue
{
     noHit                   = 0,
     vSplitterBox            = 1,
     hSplitterBox            = 2,
     bothSplitterBox         = 3,     
     vSplitterBar1           = 101,
     vSplitterBar15          = 115,
     hSplitterBar1           = 201,
     hSplitterBar15          = 215,
     splitterIntersection1   = 301,
     splitterIntersection225 = 525
};

其中,vSplitterBa1 ~ vSplitterBar15以及hSplitterBar1 ~ hSplitterBar15,就分别表示鼠标停留于水平垂直滚动条(没有写错,我怀疑是MFC的一个小bug,把v和h写反了,可以测试一下)。两组值各有15个,用于从左到右,从上到下标识各个分割条,因此也可以清楚的知道,鼠标具体停留在哪个分割条上。

有这样的函数就非常好办了,重载OnLButtonDown(...), OnMouseMove(...)然后通过HitTest知道鼠标的位置,如果刚好是在需要锁定的SplitterBar上面,那就什么也不做,直接调CWnd的消息响应函数就ok了。