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了。
浙公网安备 33010602011771号