焦点与WM_MOUSEWHEEL相关的问题

最近在使用公司界面库中发现一个问题,就是下拉框获得焦点以后父窗口无法收到WM_MOUSEWHEEL消息,即使主动设置父窗口焦点问题依然存在。一开始怀疑是焦点不再父窗口上导致的问题,然后我就在窗口类的消息处理中加上日志记录WM_SETFOCUS和WM_KILLFOCUS获取和失去焦点的窗口。

运行后的结果是,即使手动设置父窗口的焦点,父窗口确实收到了WM_SETFOCUS消息,但是紧接着子窗口也收到WM_SETFOCUS,父窗口收到WM_KILLFOCUS消息。排除各种可能性以后,确信这是windows父子窗口的一种机制,焦点在父子窗口间一定存在着某种必然的联系,就是父窗口的某个子窗口会强制夺取父窗口的焦点。

那么既然这样,这就是导致父窗口无法收到WM_MOUSEWHEEL消息的根本原因吗?继续探究,我在父窗口中加入一个界面库之外的普通WTL窗口,发现焦点在这个窗口的时候,不会导致父窗口收不到WM_MOUSEWHEEL消息。那么这就排除了子窗口夺取焦点导致父窗口收不到WM_MOUSEWHEEL的因素,所以问题还是出在界面库对WM_MOUSEWHEEL的处理上。

所以再仔细查看界面库相关代码,找到了问题的根本原因。

界面库在窗口处理WM_MOUSEWHEEL消息后直接返回了,没有交由底层api继续处理该消息,导致子窗口收到WM_MOUSEWHEEL后,没有被继续分发给父窗口。解决方法也很简单,在子窗口处理WM_MOUSEWHEEL消息的时候,按需求决定是否继续由底层处理,比如子窗口在自己被隐藏的时候,bHanded设为FALSE,继续交给父窗口处理就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值