搜故事,从300万个故事到海量知识百科的华丽转变!
搜故事 > 故事会 > 正文

实战经验:鼠标在控件上悬停和离开的使用

时间:2016-12-13

这里所说的是否在控件上,实际上有个专门的名称:Hover和Leave

提示:本文共有 1885 个字,阅读大概需要 4 分钟。

问题

在最近的工作中,碰到这样一个需求:系统能根据鼠标是否在控件上来做出不同的响应。这里所说的是否在控件上,实际上有个专门的名称: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) 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消息进行处理:

代码解释:

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

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

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

注意事项

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

总结

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

看到此处说明本文对你还是有帮助的,关于“实战经验:鼠标在控件上悬停和离开的使用”留言是大家的经验之谈相信也会对你有益,推荐继续阅读下面的相关内容,与本文相关度极高!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
每日一文(汽车销售实战经验分享)

每日一文(汽车销售实战经验分享)

客户,价格,销售顾问,销售,联保,二手车,本店,新车,旧车,案例,东西,情况,差距,领导,考核,快下班,南昌,保险,原则,口子,地方,奥迪,店客,时候,朋友,标准,简介,父子,签单,电话

2011-06-01 #故事大全

加拿大进出口贸易实战经验分享

加拿大进出口贸易实战经验分享

加拿大,产品,华人,进出口贸易,国际,市场,进出口,创业者,建议,销售渠道,优势,代理商,知识产权,货品,公司,进口,专利,中国,创新性,客户,方法,经验,税费,评论,食品,贸易,运作,公司注册,可以提供,新公司

2020-07-29 #故事会

2019年世界女排联赛第四站中国队实战积累经验

2019年世界女排联赛第四站中国队实战积累经验

中国女排,比赛,对手,土耳其女排,联赛,郎平,世界女排,主教练,机会,江门,乔瓦尼,朱婷,东京奥运会,意义,本站,积分榜,资格赛,赛事,即将开始,各参赛队,更重要,波兰女排,凯拉,王梦,中国排协,八胜,教练组,世界大赛,中国,中国体育报

2015-06-05 #经典故事

考研想要一战上岸 除了努力还得具备这些能力!听学长实战经验

考研想要一战上岸 除了努力还得具备这些能力!听学长实战经验

老师,框架,笔记,专业课,时候,模板,重点,个人,时间,逻辑,何凯文,不一样,每日一句,当回事,东西,做题,单词,文科,词汇,记忆,表格,难句,备考,作文,作文课,公式,内容,同学,图书馆学,基础

2014-11-02 #小故事

晚上怎样合理安排才能保证孩子按时睡觉?分享一下我的实战经验

晚上怎样合理安排才能保证孩子按时睡觉?分享一下我的实战经验

孩子,孩子们,时间,玥玥,让孩子,卧室,睡前故事,妈妈,卫生间,故事,时候,上小学,幼儿园,规则,上床,都会,习惯,事情,哥哥,小学,床上,规律,保持安静,亲子阅读,爱上,事儿,怎样才能,客厅,家长,小时

2020-06-26 #长篇故事

控件跟着鼠标走 VBA让你的操作随心所欲

控件跟着鼠标走 VBA让你的操作随心所欲

代码,单元格,数据,工作表,控件,属性,区域,思路,界面,内容,对象,按钮,时候,文本框,距离,顶端,属性设置,格来,大家好,下拉菜单,一行,事件,光标,再加,单元,场合,才能,宽度,能力,篇文章

2020-08-09 #小故事

印军鼓吹阵风有实战经验 歼20是纸上谈兵 网友:出来试试就有了

印军鼓吹阵风有实战经验 歼20是纸上谈兵 网友:出来试试就有了

阵风,战机,印度,印军,实战经验,装备,我国,世界,国防,武器,实力,实战,欧洲,法国,经历,高原地区,研发,纸上谈兵,白夜,一直以来,三雄,印度政府,达索公司,事业,三角翼,下单,下风,事实,任务,军工

2011-07-30 #故事会在线阅读

纸上谈兵钓不好鱼 结合实战总结几点经验 分享给喜欢野钓的朋友

纸上谈兵钓不好鱼 结合实战总结几点经验 分享给喜欢野钓的朋友

水库,大鱼,饵料,钓饵,诱饵,鱼儿,双凤水库,关键,原则,商品,才能,水面,玉米面,白面,豆饼,鱼粉,嫩玉米,成一个,伊势尼,山如黛,山奈,春夏季,热得,米左右,大有,小鲫鱼,岁月,山水,全市,五大

2010-12-09 #故事会在线阅读