问题:在最近的工作中,我遇到了一个要求,即系统可以根据鼠标是否位于控件上方而做出不同的响应。我不确定你在这里所说的是否是在控件上,但它们实际上有特殊的名称:悬停和离开。所谓悬停是指将鼠标悬停在窗口所在的矩形区域上的指定时间。所谓“离开”,是指鼠标离开窗口的矩形区域。
Windows 用于表示这两个事件的消息分别是WM_MOUSEHOVER 和WM_MOUSEELEAVE。首先我们看一下MSDN对这两条消息的解释。
WM_MOUSEHOVER:
当光标位于窗口的客户区上方并达到先前TrackMouseEvent 调用中指定的持续时间时,光标将被发布到窗口。
WM_MOUSELEAVE:
当光标离开先前TrackMouseEvent 调用中指定的窗口客户区时发布到窗口。
在本次讨论中,我们将提到一个重要的函数:TrackMouseEvent。我们来看看这个函数。
跟踪鼠标事件:
当鼠标指针离开窗口或在窗口上停留指定时间时发布消息。
该函数的主要作用是当鼠标光标移过指定时间窗口或离开窗口时发送WM_MOUSEHOVER或WM_MOUSEELEAVE消息。
因此,必须在适当的时间调用TrackMouseEvent来触发WM_MOUSEHOVER/WM_MOUSELEAVE消息。那么什么时候是合适的时间呢?
调用TrackMouseEvent 的最佳时间是在WM_MOUSEMOVE 事件处理函数内,因为鼠标在用户控制下随时移动。
要处理WM_MOUSEMOVE,首先将对TrackMouseEvent 的调用添加到WM_MOUSEMOVE 事件处理函数中。这里我们将创建一个继承自CMFCButton 的自定义类CMyButton。
代码解释:
1) m_bTrackingMouse 用于指示是否进行鼠标跟踪。稍后我们将使用这个变量。
2) dwFlags 指定感兴趣的事件消息。这里设置为TME_LEAVE | TME_HOVER,表示应用程序想要接收WM_MOUSEHOVER和WM_MOUSELEAVE消息。
3) hwndTrack:指定鼠标悬停或远离的目标窗口。系统只会检测到在此窗口上执行的操作。
4) dwHoverTime:指定时间,以毫秒为单位。当您将鼠标悬停在指定窗口上时,系统将在此时间后触发WM_MOUSEHOVER 消息。
5) 注意这里必须添加ON_WM_MOUSEMOVE()来建立消息映射。
6) 这里使用_TrackMouseEvent而不是TrackMouseEvent,原因如下:
_TrackMouseEvent 函数调用TrackMouseEvent(如果存在),否则_TrackMouseEvent 模拟TrackMouseEvent。
接收悬停或离开消息接下来,分别处理WM_MOUSEHOVER 和WM_MOUSEELEAVE 消息。
代码解释:
1)分别使用两个宏ON_WM_MOUSEHOVER和ON_WM_MOUSEELEAVE建立消息映射。
2) 当您收到鼠标悬停消息时,您知道鼠标已经在窗口矩形内,并且不需要鼠标跟踪。目前,将m_bTrackingMouse 设置为false 会禁用对TrackMouseEvent 的后续调用,并防止系统进行不必要的鼠标跟踪。
3) 如果您收到鼠标离开消息,这意味着鼠标已离开窗口所在的矩形,请通过将m_bTrackingMouse 设置为true 来重新启用鼠标跟踪。
注1)有些控件,如CStic控件,默认不触发WM_MOUSEHOVER和WM_MOUSELEAVE消息。通知必须设置为true。
总结本文使用实际代码来演示鼠标悬停和消息的生成和触发过程。通过这种实践,你可以将此功能代码添加到控件的自绘中,以实现特殊效果,例如当鼠标悬停在控件上时改变控件的外观。
本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/646276.html