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,这样事件和顺序就没有问题了。 |
|