转载请说明原出处,谢谢~~
对象 : 使用着 Redrain 的 uilib , 下载地址: 《Redrain个人维护并使用的DuiLib和UiLib库源码下载地址》
问题描述: wke 控件加载网页时, 竖直滚动条, 首次使用滚轮没有反应, 需点击wke控件内部, 后才有响应
目标: 不需要点击, 直接可响应滚轮消息
问题分析: 滚轮消息没有响应, 通过点击, 可以响应, 怀疑焦点问题
方法尝试: 1, 设置 wke 控件 SetFocus(); 将焦点设置在wke控件上
(结果) 没有达到效果
2, 进入 CWkeWebkitUI 进行源码分析 发现 SetCapture 为设置了 鼠标捕获 绑定了窗口, 于是展示控件加入
SetFocus(m_hWnd);
SetCapture(m_hWnd);
(结果)没有达到效果
最终解决方法: CWkeWebkitUI 的友员 CWkeWebkitWnd 类对窗口对行管理, 通过 HandleMessage 进行消息过滤 , 调试跟踪发现 WM_MOUSEMOVE 这个消息 在 OnMouseEvent 事件响应里为 在鼠标刚进入窗口时起响应, 于是尝试在鼠标消息里加入
源代码
if (uMsg == WM_LBUTTONDOWN || uMsg == WM_MBUTTONDOWN || uMsg == WM_RBUTTONDOWN )
修改后 if (uMsg == WM_LBUTTONDOWN || uMsg == WM_MBUTTONDOWN || uMsg == WM_RBUTTONDOWN || uMsg == WM_MOUSEMOVE) { SetFocus(m_hWnd); SetCapture(m_hWnd); }
改成这样后, 可以有效果, 直接可以响应滚轮。 但是带来的问题是, 须要 ReleaseCapture 后才能释放焦点, 这时可以利用一个小技巧, 在 OnMouseEvent 里获取鼠标位置
POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam);
其它思路: CWkeWebkitUI 中 DoEvent 可以通过消息 UIEVENT_MOUSEENTER 与 UIEVENT_MOUSELEAVE 判断控件在客户区与离开客户区 , 通过与消息通信, 可以达到更好的效果, 具体的可以进行尝试。
欢迎大家有好的意见留言进行探讨~~