在 Win32 应用程序中模仿 Acrylic

2023-11-22

微软最近宣布亚克力,Fluent Design 中类似玻璃的材料。它仅以 XAML/UWP 形式呈现,但看起来与玻璃非常相似,只是它可以任意着色,并且可以在应用程序内应用于 Flyover 控件以及应用程序的独立窗口。

“食谱”让它看起来好像是在 XAML 本身中实现,没有接触到更广泛的系统。

Microsoft's recipe for making acrylic: background, blue, blend, tint, noise

一个相关的SO问题证实了这一点(它缺乏具体的技术答案,但暗示丙烯酸不能像玻璃一样通过 WinAPI 获得。)

有人会如何在普通的旧 Win32 应用程序中模仿这个?使用玻璃并混合? (哪些 API,以及Win10 秋季更新的 glass API 有什么可能是 Win7 中没有的?)如果应用程序是使用 Win32 创建的,但使用 DirectX 表面进行渲染,是否会带来更多可能性?


正如 @zett42 的回答中提到的,我认为它是使用 DirectComposition 实现的。

一点历史:在 Vista 中,Microsoft 引入了桌面窗口管理器 DWM,它是桌面的合成引擎。使用 DWM,窗口绘制纹理,然后在 DWM 中组合这些纹理。好处是您可以获得 3D 动画、透明度等奇特效果,并且所有内容都是双缓冲的,因此您不会获得任何渲染伪影。

DWM最初是基于MIL(媒体集成层),我认为这是一个场景图API。有趣的是,当时推出的 WPF 也使用了 MIL。这真的很酷,因为 DWM 可以看到 WPF 窗口的场景图,并且当它产生这样的效果(例如放大窗口)时,它会将其视为矢量而不是位图,因此它可以在没有伪影的情况下缩放它。然而,在某个时候,Microsoft 分叉了 WPF 中使用的 MIL 版本,这种集成就丢失了。

快进几年到 Windows 8。微软推出了新的“Metro”应用程序(后来的“Modern”,现在的“UWP”)。在幕后,这些现代应用程序使用新的 API 进行组合:DirectComposition。此 API 也可用于 Win32 应用程序,并且现在由 DWM 本身使用。如果您查看公共 DWM 函数,会发现一些与 MIL 相关的函数已被弃用,因此它支持我的理论,即 MS 从 MIL 转向 DC。现在我们再次处于应用程序和 DWM 使用相同基础设施的初始情况,我们可以轻松添加一些有趣的效果。

在某个时候,MS 向 DirectComposition 引入了新的混合效果,由IDCompositionDevice3界面。其中包括高斯模糊效果,还有噪点、色调和其他必要的效果。我找到了应用这些效果的方法within我的窗口,但我不知道如何应用它们to我的窗户。不幸的是,我现在无法访问我的代码,当我访问时我会更新我的答案。

我的探索基于这篇文章高效的 Alpha 混合窗口:DirectComposition。基本上,您有一个与屏幕相对应的“设备”,以及一个与窗口内容相对应的“视觉”。你需要改变的是:

  • 您的设备可以为您创建效果。记得QueryInterface it to IDCompositionDevice3.
  • 然后,您可以致电SetEffect在你的IDCompositionVisual3.

然而,正如我所说,这仅适用于窗口contents。我认为必须有一个秘密API来从DWM获取当前窗口的父Visual,然后它应该只是调用的问题SetEffect在该视觉上获得效果。如果有人熟练使用调试器,应该可以通过跟踪使用 Acyllic 效果的 UWP 应用来找到该 API。

作为一个意外的收获,我将查看 GetWindowCompositionAttribute 函数。它最近获得了一些听起来很有趣的标志,例如 WCA_VISUAL_OWNER。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Win32 应用程序中模仿 Acrylic 的相关文章

  • Windows 睡眠功能极慢

    我正在通过 Windows h 使用 Sleep 命令制作一个程序 并且在 Windows 10 而不是 Windows 7 上运行我的程序时遇到了令人沮丧的差异 我将我的程序简化为下面的程序 它与我的更复杂的程序表现出相同的行为 在 Wi
  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 如何在Windows 8上正确使用SCardGetStatusChange?

    智能卡服务在 Windows 8 上的行为有所不同 并且 MSDN 尚未更新其文档 任何人都可以提供有关如何正确调用 SCardGetStatusChange 来监视 Windows 8 上的智能卡操作的代码片段吗 提前致谢 这是我为个人博
  • 如何通过命令行将Flash .fla编译为.swf? [复制]

    这个问题在这里已经有答案了 如何在基于 Windows 的操作系统上通过命令行将 Flash fla 文件编译为 swf 需要安装的命令行工具就可以了 谁能建议我该怎么做 以直接的方式 谢谢 您可以使用JSFL为 Flash IDE 编写脚
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • VB - 以隐式方式链接 DLL

    我正在开发 VB6 图形界面 并且需要隐式链接到 DLL 这样做的动机来自于我上一个问题 https stackoverflow com questions 5194573 有问题的 DLL 使用静态 TLS declspec thread
  • C# WMI 在远程 PC 上运行一个 exe,然后在同一台 PC 上运行另一个 exe,然后在网络路径上调用 Directory.CreateDirectory 并失败

    使用 C WMI 我在另一台计算机上启动一个 exe 该 exe 使用 C 启动另一个 exeProcess班级 最后一个 exe 尝试调用Directory CreateDirectory使用网络路径 又名 comp1 d dir Dir
  • 如何使用Python在Django for Windows中激活虚拟环境?

    我被告知要在 Django for Windows 中激活虚拟环境 我应该尝试 environment path Scripts activate 但是当我输入该命令时 cmd 返回此错误 该系统找不到指定的路径 我通过输入以下命令创建了虚
  • 可以读取目标文件吗?

    我很好奇 obj文件 我几乎不知道它们是什么 或者它们包含什么 所以我用 Vim 文本编辑器打开它们 我在里面发现了一种类似外星人的语言 有什么办法可以理解它们代表什么以及它们的内容是什么 另外 它们的用途是什么 Thanks Sure 但
  • conio.h 不包含 textcolor()?

    我一直在考虑在我用 C 编写的 DOS 程序中使用颜色 有人告诉我conio h有textcolor 函数 但是当我在代码中使用它时 编译器 链接器会向我抛出错误 说我对该函数有未定义的引用 Does conio h真的有这个功能还是有人告
  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 在 Windows 上查找父进程 ID

    Problem 给定远程 Windows 主机上的进程 ID 和命令行访问权限 如何找到其父进程的 PID Solution 鉴于 Marc B 的回答 我们可以使用 WMIC 命令示例here https learn microsoft
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win

随机推荐