-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
提供了Direct2D渲染支持,大幅提升任务栏窗口透明渲染效果 #1156
提供了Direct2D渲染支持,大幅提升任务栏窗口透明渲染效果 #1156
Conversation
类DrawCommonBuffer会在构造时创建一个ARGB32的缓冲区用于绘图,并在析构时调用::UpdateLayeredWindowIndirect通知Windows更新窗口后删除缓冲区
同时修复了编译错误
使用IDrawCommon抽象了原有的渲染接口并使用D2D实现。使用IDrawBuffer抽象了原有的双缓冲类。
修复了DrawCommonUnion和DrawCommonBufferUnion未正确初始化Nullable类型对象导致的内存错误。 修复了D2D1DCSupport未正确初始化内存导致的错误。 修复了DWriteFont未释放的内存泄露问题。 修复了无法正常检测D2D是否存在的问题 修复了D2D渲染器无法绘制虚线的问题。 修复了D2D渲染器DPI处理不正确的问题。 修复了D2D渲染器函数ExecuteGdiOperation无法在绘制过程中正确与GDI交互的问题。 为D2D渲染器引入了延迟加载特性,如果软件本身不触发D2D渲染则渲染器将不会初始化。 zhongyang219#777 zhongyang219#955 zhongyang219#837
DrawCommonBuffer更新窗口失败时会弹窗提示并自动禁用D2D渲染,同时也会写入错误日志 减小了DrawCommonBuffer类体积 修复了DrawCommonHelper::ForEachPixelInBitmapForDraw函数遍历范围不正确的问题
但是关闭了插件自绘时的文本抗锯齿,会影响渲染的文本质量
在D2D1DrawCommon中抛出异常不会引起程序崩溃,而是回退到GDI渲染并记录日志。
移动StaticVariableWrapper类及辅助函数到Common.h中 添加了GetArrayLength用于编译期推断数组长度
请问如何下载此PR中的 D2D 版本的软件?我不会编译。 |
我更新了PR的说明,添加了下载的教程,你可以再看看下载部分的内容。 |
代码已合并,感谢你为TrfficMonitor做出的改进 |
Merge pull request zhongyang219#1156 from BombaxCeiba/TransparentSupport
CI 版本已过期,请求新的下载方式 |
见最新的版本 #1656 |
This artifact has expired and you can no longer download it |
下载
GitHub Action
*下载方式:点击上面的 GitHub Action ,进入后选择带TransparentSupport标识的最新的一项点进去,拉到网页最下面,32位系统选择x86开头的文件下载,64位系统选择x64开头的文件下载即可。
系统兼容性
程序在Windows 11 22000.918上正常工作,但因为在Windows 7和Windows 8上任务栏窗口调用函数UpdateLayeredWindowIndirect更新窗口内容时会失败并得到错误87,所以这一功能暂不支持这两个系统版本。
对于Windows 8.1以及以上的系统版本,由于支持Direct Composition,在UpdateLayeredWindowIndirect失败后会使用Direct Composition对D2D渲染结果进行呈现。
在Windows Server 2022 20348.1366上,也会因为相同的原因使用Direct Composition进行呈现。
HDR兼容性
程序在Windows Server 2022 20348.1366上,在使用Direct Composition时可以正常呈现。
D2D渲染实现说明
通过对原有的CDrawCommon类在CTaskBarDlg类的ShowInfo方法中用到的函数进行提取后,添加了apha参数后单独放到IDrawCommon类中定义为纯虚函数。再将ShowInfo中用到的CDrawCommon类全部替换为IDrawCommon来实现对老代码的兼容。
D2D和GDI互操作
为了兼容插件的GDI调用,所有插件的绘制会被重定向到一个临时的DIB上,并且插件(包括通过MFC间接)调用的User32.dll中的DrawText和DrawTextEx系列函数都会被hook到一个支持透明度的版本上。在插件绘制完成后,DIB会被上传到显卡。显卡会将透明度为1的值(对应未被GDI绘制过的部分)修改为0,将透明度为0的值修改为255(对应被GDI绘制过的部分),其余透明度的值保留,得到的结果再和程序绘制的部分相叠加以得到最终显示用的结果。
由于微软的神奇bug,IDXGISurface1::GetDC的调用会偶尔出现下面这种报错:
可以不用理会。
禁用D2D绘图
找到任务栏窗口设置,勾选这个(在最下面的)选项即可
D2D绘图和GDI绘图效果对比
D2D:
GDI:
*使用D2D渲染时,可以避免背景颜色变化导致的闪烁现象。
并且D2D内存占用大一点fix #955
fix #837
fix #1068