找回密码
 立即注册

QQ登录

只需一步,快速开始

graper

高级会员

45

主题

63

帖子

1348

积分

高级会员

积分
1348

活字格认证

graper
高级会员   /  发表于:2009-12-15 11:39  /   查看:11442  /  回复:0
Post by "winking",  09-19-2007, 17:54
-----------------------------------------------------


近期项目开发过程中发现了一个很奇怪的Bug,我们控件(Control)有自己的弹出窗口(DropDown, 像ComboBox的下拉窗口一样),弹出DropDown之后,再使用鼠标单击下拉窗口(该窗口可以获得Focus),发现收到的事件顺序如下:
       Control.LostFocus -> DropDown.LostFocus -> DropDown.GotFocus
如图中红色标出,这个LostFocus消息非常的奇怪(这中间还有其他几个事件,我并没有列出),因为DropDown的显示是由我们自己采用调用ShowWindow API,并且加上了SW_SHOWNOACTIVATE参数,也就是说,在鼠标单击之前,这个DropDown是Deactivated,当然也没有Focus,怎么会来这么一个LostFocus消息呢?

经过调查发现,这是Windows处理的问题,如果使用ShowWindow API带SW_SHOWNOACTIVATE参数显示一个Window,然后去Focus这个Window时,系统会先给显示出来的这个非激活的window Send一个WM_KILLFOCUS消息(导致LostFocus事件),然后再发一个WM_SETFOCUS消息。

解决方案:
      在使DropDown获得Focus之前,先调用GetActiveWindow判断DropDown是否激活,如果没有激活,先调用SetActiveWindow激活DropDown,再调用Focus方法使DropDown获得Focus,这样事件和顺序就没有问题了。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部