如何用Vortice和DirectComposition实现透明窗口的显示?
摘要:通过 DirectComposition 配合 WS_EX_LAYERED 或 WS_EX_NOREDIRECTIONBITMAP 窗口样式,可以让窗口高性能地背景透明,完全依靠 DWM 将窗口背景和桌面画面合成
本文是渲染相关系列博客中的一篇,该系列博客已按照逻辑顺序编排,方便大家依次阅读。如您对渲染相关感兴趣,可以通过以下链接访问整个系列:渲染相关系列博客导航
在 DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色 博客中和大家介绍了最简方式创建了窗口和对接了 DirectX 层。在此基础上,大家也能看到此时创建的窗口是无法应用透明背景效果的
即使强行设置 SwapChainDescription1.AlphaMode 为 AlphaMode.Premultiplied 也会在 IDXGIFactory2.CreateSwapChainForHwnd 报错
传统 Win32 应用可以通过 UpdateLayeredWindow 方法设置窗口透明,然而 UpdateLayeredWindow 是有比较大的性能代价的,详细请参阅 WPF 从最底层源代码了解 AllowsTransparency 性能差的原因
性能较好的透明窗口实现可参阅 WPF 制作支持点击穿透的高性能的透明背景异形窗口
以上是在 WPF 框架里面帮忙封装好的,现在咱只有纯控制台,需要自己手动干一些活
为了方便大家阅读,本文将重新从零控制台开始,先创建好 WS_EX_LAYERED 的窗口,再将 DirectX 对接上去。总代码控制在 500 行左右。额外,为了方便 Win32 方法调用,本文还请出了 CsWin32 库,详细使用方法请参阅
dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑
准备工作
按照 .NET 惯例,先安装一些库。
