焦点与WM_MOUSEWHEEL相关的问题

来源:互联网 发布:淘宝宝贝图片下载 编辑:程序博客网 时间:2024/05/21 09:19

最近在使用公司界面库中发现一个问题,就是下拉框获得焦点以后父窗口无法收到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
原创粉丝点击