nim_duilib创建非离屏CEF控件遇到的问题


 

1.目的是实现-webkit-app-region,网页拖动窗口

2.官方的cefclient代码,通过子类化处理:WM_NCHITTEST返回HTTRANSPARENT可以实现

3.但自己实现的时候,却发现,窗口在CEF的几个子窗口之间反复传递WM_NCHITTEST,占用CPU并卡主

4.WM_NCHITTEST 消息 (Winuser.h) - Win32 apps | Microsoft Learn,官方文档是写了:在同一线程当前由另一个窗口覆盖的窗口中(消息将发送到同一线程中的基础窗口,直到其中一个窗口返回不是 HTTRANSPARENT 的代码),但感觉自己的代码都是在主线程跑的,CEF也是主线程,觉得不是这个问题

5.找到如下文章,发现描述:

当你准备使用返回 HTTRANSPARENT 时,一定要保证你坐标所在的父子窗口在同一个线程!

返回 HTTRANSPARENT 时,操作系统只会查找同线程的其他窗口,如果你的父窗口非同一个线程,那么操作系统处理消息循环时是找不到下一个处理消息的窗口的。

如果你一定要在父窗口非同一个线程时返回 HTTRANSPARENT 那么你的整个窗口(顶层窗口和子窗口)将无法再操作!你可以阅读 HTTRANSPARENT is evil - virtualdub.org 了解相关的坑。

当无边框窗口被子窗口遮挡导致难以调节窗口大小时,可通过处理 NCHITTEST 消息重新支持调节窗口大小 - walterlv

6.通过SPY++,发现果然不在一个线程,顶层窗口是主线程,CEF的窗口是CEF的UI线程;CEF的UI线程并不是主线程

7.通过将创建主窗口的任务放到CEFUI线程解决CefPostTask(TID_UI, new CreateWindowTask());

8.CreateWindowTask是自己派生的CefTask,用来投递任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值