akesmallpic(this,600,1800);' src="F07zg10.gif" width="572" height="402" border="0" />
那么,问题在哪里呢?
请试一试下面的操作:在BLOKOUT1的显示区域按下滑鼠的左键,然後将游标移出视窗。程式将停止接收WM_MOUSEMOVE讯息。现在释放按钮,BLOKOUT1将不再获得WM_BUTTONUP讯息,因为游标在显示区域以外。然後将游标移回BLOKOUT1的显示区域,视窗讯息处理程式仍然认为按钮处於按下状态。
这样做并不好,因为程式不知道发生了什么事情。
拦截的解决方案
BLOKOUT1显示了一些常见的程式功能,但它的程式码显然有缺陷。这种问题就是要使用滑鼠拦截来对付。如果使用者正在拖曳滑鼠,那么当滑鼠短时间内被拖出视窗时应该没有什么大问题,程式应该仍然控制著滑鼠。
拦截滑鼠要比放置一个老鼠夹子容易一些,您只要呼叫:
SetCapture (hwnd) ;
在这个函式呼叫之後,Windows将所有滑鼠讯息发给视窗代号为hwnd的视窗讯息处理程式。之後收到滑鼠讯息都是以显示区域讯息的型态出现,即使滑鼠正在视窗的非显示区域。lParam参数将指示滑鼠在显示区域座标中的位置。不过,当滑鼠位於显示区域的左边或者上方时,这些x和y座标可以是负的。当您想释放滑鼠时,呼叫:
ReleaseCapture () ;
从而使处理恢复正常。
在32位元的Windows中,滑鼠拦截要比在以前的Windows版本中有多一些限制。特别是,如果滑鼠被拦截,而滑鼠按键目前并未被按下,并且滑鼠游标移到了另一个视窗上,那么将不是由拦截滑鼠的那个视窗,而是由游标下面的视窗来接收滑鼠讯息。对於防止一个程式在拦截滑鼠之後不释放它而引起整个系统的混乱,这是必要的。
换句话说,只有当滑鼠按键在您的显示区域中被按下时才拦截滑鼠;当滑鼠按键被释放时,才释放滑鼠拦截。
BLOKOUT2程式
展示滑鼠拦截的BLOKOUT2程式如程式7-7所示。
程式7-7 BLOKOUT2
BLOKOUT2.C
/*----------------------------------------------------------------------------
BLO