在我的Win32应用程序中,当我按住鼠标左键并快速将鼠标指针移出窗口时,我不会收到WM_MOUSELEAVE消息.但是,如果我按住鼠标左键,从窗口内部开始并缓慢移动通过窗口边缘,它将生成WM_MOUSELEAVE.
如果我没有按住鼠标左键,无论鼠标指针移出窗口的速度有多快,我每次都会收到WM_MOUSELEAVE消息.
有什么不同?我能做些什么来妥善处理这两种情况?
编辑:如果我左键单击并按住,移出窗口然后松开鼠标左键我收到WM_MOUSELEAVE消息.但现在为时已晚.
在Windows 7上,我试图制作一个所有者绘制的按钮.为了获得更准确的mouseenter/mouseleave事件,我将按钮子类化了.当我这样做时,我在获得WM_MOUSEMOVE时使用了TrackMouseEvent,因为只有当鼠标悬停在按钮上时才会发布.如果还没有设置,我会设置一个布尔值来指定鼠标位于按钮上方以及调用TrackMouseEvent,这样只要鼠标离开,我就可以取消设置我的布尔值.然而,就像你一样,当我按下并按住所有者绘制按钮上的鼠标左键,然后将鼠标拖出时,我没有得到WM_MOUSELEAVE.在按钮外面释放鼠标时,我突然收到WM_MOUSELEAVE消息 - 太迟了.
我确定这种行为的原因是默认按钮proc对WM_LBUTTONDOWN的处理调用SetCapture,并在以后释放它.SetCapture的使用正在打破我们对WM_MOUSELEAVE事件的接收.但是,作为调用SetCapture的副作用,即使控件不在鼠标下,我们也会得到WM_MOUSEMOVE事件.因此,我的解决办法是复制在WM_MOUSELEAVE逻辑在WM_MOUSEMOVE处理程序来取消我的布尔值,表示鼠标移动到按钮,如果我得到一个鼠标移动事件这是我的按钮的区域之外.如果SetCapture实际上并不里面WM_LBUTTONDOWN用于默认按钮PROC,那么我们就已经了解我们的WM_MOUSELEAVE消息和代码仍然可以工作...所以这种解决方法在这两种情况下工作.
你的问题听起来可能与我的相同,所以希望这对你有所帮助.
| 归档时间: |
|
| 查看次数: |
7475 次 |
| 最近记录: |