当前位置:首页 > 经验 >

怎么才能让鼠标停留在指定的位置(鼠标一键回到特定位置)

来源:原点资讯(www.yd166.com)时间:2022-11-06 03:32:13作者:YD166手机阅读>>

问题

在最近的工作中,碰到这样一个需求:系统能根据鼠标是否在控件上来做出不同的响应。这里所说的是否在控件上,实际上有个专门的名称:Hover和Leave。所谓Hover,指的是鼠标在窗口所在的矩形区域上悬停指定的一段时间。所谓Leave,则是指鼠标离开窗口所在的矩形区域。

使用到的消息

在Windows中,分别使用WM_MOUSEHOVER和WM_MOUSELEAVE来表示这两种事件。我们先来看看MSDN对这两种消息的描述:

WM_MOUSEHOVER:

Posted to a window when the cursor hovers over the client area of the window for the period of time specified in a prior call to TrackMouseEvent.

WM_MOUSELEAVE:

Posted to a window when the cursor leaves the client area of the window specified in a prior call to TrackMouseEvent.

这里的描述中,提到一个重要的函数TrackMouseEvent。我们在来看看这个函数。

TrackMouseEvent:

Posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time.

此函数的主要作用是当鼠标光标悬停在某个窗口上一段指定的时间,或者离开某个窗口时,发送WM_MOUSEHOVER或者WM_MOUSELEAVE消息出来。

所以,为了触发WM_MOUSEHOVER/WM_MOUSELEAVE消息,必须在合适的时间点调用TrackMouseEvent。那什么时候是合适的时间点呢?

鼠标会根据用户的操控随时移动,所以,最佳调用TrackMouseEvent的时间点:WM_MOUSEMOVE事件处理函数中。

对WM_MOUSEMOVE的处理

我们先在WM_MOUSEMOVE事件处理函数中添加对TrackMouseEvent的调用,这里我们创建了一个自定义类CMyButton,该类继承自CMFCButton:

怎么才能让鼠标停留在指定的位置,鼠标一键回到特定位置(1)

代码解释:

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的原因如下:

The _TrackMouseEvent function calls TrackMouseEvent if it exists, otherwise _TrackMouseEvent emulates TrackMouseEvent.

接收悬停或离开消息

接下来,我们分别对WM_MOUSEHOVER和WM_MOUSELEAVE消息进行处理:

怎么才能让鼠标停留在指定的位置,鼠标一键回到特定位置(2)

代码解释:

1) 分别使用ON_WM_MOUSEHOVER和ON_WM_MOUSELEAVE这两个宏建立消息映射。

2) 当收到鼠标悬停消息时,可以知道鼠标已经位于窗口所在矩形中了,不再需要鼠标跟踪了。这个时候设置m_bTrackingMouse为false,就会禁用后续TrackMouseEvent的调用,防止系统不必要的鼠标跟踪。

3) 当收到鼠标离开消息时,表示此时鼠标已经离开窗口所在矩形,设置m_bTrackingMouse为true,以重新启用鼠标跟踪。

注意事项

1) 有些控件,比如CStatic控件,默认是不会触发WM_MOUSEHOVER和WM_MOUSELEAVE消息的,需要设置Notify为true。

总结

本文通过实际的代码,演示了鼠标悬停和离开的消息的产生以及触发流程。通过这次实践,我们可以在控件自绘中加入此功能代码,实现诸如鼠标悬停时改变控件外观等特效。

栏目热文

怎么把鼠标固定到想要的位置不动(鼠标如何固定在一个位置)

怎么把鼠标固定到想要的位置不动(鼠标如何固定在一个位置)

伴随着显示器尺寸的增大和分辨率的提升,有时候想要找到鼠标光标位置需要一点时间,尤其是使用多显示器的情况下。科技媒体 Th...

2022-11-06 03:33:13查看全文 >>

怎么把鼠标设置成别的形状(鼠标设置成图案)

怎么把鼠标设置成别的形状(鼠标设置成图案)

我们正常在使用电脑的时候,有一个很重要的伙伴——鼠标。但是你知道吗?鼠标也是有样式的呦,也是能更改很多漂亮的图形的。我们...

2022-11-06 03:48:06查看全文 >>

二婚宠妻全文免费阅读(暖宠二婚妻全文免费阅读)

二婚宠妻全文免费阅读(暖宠二婚妻全文免费阅读)

一、《八零年代二婚妻》作者:尔知雅意文章进度:2021-06-22 完结全文字数:656713字章数:131章主角:许疏...

2022-11-06 03:08:02查看全文 >>

鼎礼之婚全文免费阅读(长安第一嫁全文免费阅读)

鼎礼之婚全文免费阅读(长安第一嫁全文免费阅读)

To view this page ensure that Adobe Flash Player version 11....

2022-11-06 03:44:10查看全文 >>

沈翘夜莫深讲了什么(夜莫深沈翘大结局是什么)

沈翘夜莫深讲了什么(夜莫深沈翘大结局是什么)

“不用了老爷子,我只是普通的感冒而已,我呆会自己出去药店买点药就可以。”沈翘及时出声阻止。夜老爷子精明的眼睛盯着她,沈翘...

2022-11-06 03:32:38查看全文 >>

鼠标怎样设置箭头直接到下一步(鼠标箭头怎么调正)

鼠标怎样设置箭头直接到下一步(鼠标箭头怎么调正)

作为职场中的一员,提供给老板的数据不仅要正确,还要生动富有内容,象下图中两张表格,你更喜欢哪张呢?是不是第二张表格比第一...

2022-11-06 03:16:57查看全文 >>

鼠标如何快速拉到最下面一栏(鼠标如何快速下拉)

鼠标如何快速拉到最下面一栏(鼠标如何快速下拉)

雷蛇是全球玩家都熟悉的游戏外设品牌,旗下的鼠标以蝰蛇最为出名,不过雷蛇的每一款外设基本都会得到玩家的认可,太攀皇蛇同样是...

2022-11-06 03:04:33查看全文 >>

鼠标怎么设置单击偏移(鼠标侧边前后移动键怎么设置)

鼠标怎么设置单击偏移(鼠标侧边前后移动键怎么设置)

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游...

2022-11-06 03:50:14查看全文 >>

鼠标左键拉蓝色边框怎么设置(鼠标左键框选从蓝色变成了虚线)

鼠标左键拉蓝色边框怎么设置(鼠标左键框选从蓝色变成了虚线)

熟练AUTOCAD,除了熟练使用每一个快捷键,还得能熟练掌握鼠标的各按键功能,只有两者相结合,才算熟练掌握cad的运用...

2022-11-06 03:32:10查看全文 >>

怎么快速让鼠标到最下边(怎么让鼠标一下拉到底)

怎么快速让鼠标到最下边(怎么让鼠标一下拉到底)

有时候因为屏幕比较大,或者显示颜色比较单一的情况下,可能会突然找不到自己的鼠标位置不过还好,也不会对使用有啥影响,后来小...

2022-11-06 03:08:18查看全文 >>

文档排行