BUG造成的影响

继承自WindowImplBase的窗口类, 如果没有重写重写ResponseDefaultKeyEvent而由WindowImplBase默认处理的话, 会导致按一次有ESC键, 导致多个窗口全部关闭.

产生原因

第1张图:
esc1

ESC按键属于PreMessage, 所以会经由这里的PreMessageHandlers处理, 如果 MessageHandler 处理了该消息, 那么她就应该置 bHandled 为 true, 以防止 ESC 消息继续往下传导致多个窗口关闭.


第2张图:
esc4

如果处理了 ResponseDefaultKeyEvent, 那个应该返回TRUE.

但实际的代码作者处理时大意了:

第3张图:
esc2

参数 hHandled 被注释掉了, 所以此函数导致的结果是:  bHandled 总是为 false.  由于为false, 进一步导致ResponseDefaultKeyEvent 的返回值无用. 所以应当像下面这样做修改.

解决方案

第4张图:
esc3

在头文件以及 MessageHandler 中开启 bHandled 参数的使用.
并修改 bHandled 的值为 ResponseDefaultKeyEvent 的返回值. 代表是否已经处理. 返回值无效, 没有使用.

参考修改: https://github.com/movsb/duilib/commit/5927b28

女孩不哭 @ cnblogs.com/memset @ 2014-07-01

转载于:https://www.cnblogs.com/memset/p/duilib_all_windows_close_once_esc.html

返回
顶部