delphi mousemove 判断鼠标是否移入控件_为什么没有鼠标移入(WM_MOUSEENTER)消息?

问题

在面向Windows事件模型进行编程的时候,我们知道有一个WM_MOUSELEAVE消息表明鼠标离开某个窗口的事件发生了。但是,为什么没有对应的WM_MOUSEENTER消息呢?

7853bb68057630a952a4b581f6941ebb.png

问题答案

因为你自己就可以弄明白整个鼠标事件的过程,从而间接的得到WM_MOUSEENTER消息。

详解

当你收到WM_MOUSELEAVE消息的时候,可以设置一个标志位,表明:此时鼠标已经处于窗口之外了。当你收到WM_MOUSEMOVE消息的时候,如果你发现这个标志位已经被设置了,说明鼠标已经移入到窗口的范围了(此时你需要清除这个标志位以对应这个状态)。

让我们以下面的例子代码来解释我们上面所说的。

32a7c6e388b976c50ec2ed1a2bea02b4.png

代码解析

上面代码执行起来的效果是:当鼠标位于窗口客户区的时候,电脑的蜂鸣器将会发出一次声音。我们定义了一个标志g_fMouseInClient,用来表明当前鼠标是否位于窗口客户区。

当我们收到WM_MOUSELEAVE消息时,Windows告知你鼠标已经离开了窗口区域,这个时候我们就将这个标志位设置为FALSE。

当鼠标在窗口上移动的时候,我们会判断这个标志位,如果标志位为FALSE,表明这是鼠标第一次在窗口上移动,也即:鼠标第一次进入窗口区域,这样我们就相当于收到了WM_MOUSEENTER消息。

接下里的处理代码里,我们将标志位设置为TRUE,并发出蜂鸣器声音。需要注意的是,我们还调用了TrackMouseEvent来触发WM_MOUSELEAVE消息。为什么是触发WM_MOUSELEAVE消息,因为我们在tme.dwFlags的标志中显式指明了这一点。

练习题

如果程序开始运行的时候,鼠标就已经在窗口客户区了,此时鼠标没有做任何移动,为什么你还是会听到蜂鸣器的声音呢?

问题答案揭晓

因为Windows在窗口创建的时候会发送虚拟的WM_MOUSEMOVE消息,此时我们的WM_MOUSEMOVE消息处理例程就可以得到执行,所以你会听到蜂鸣器的声音。

这实际上是一个很好的设计,因为在这种情况下,我们就有机会在窗口创建时处理一些与鼠标有关的初始化工作。

47f1941d570cbb3ae676f9c029dfd737.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值