微软最近宣布亚克力,Fluent Design 中类似玻璃的材料。它仅以 XAML/UWP 形式呈现,但看起来与玻璃非常相似,只是它可以任意着色,并且可以在应用程序内应用于 Flyover 控件以及应用程序的独立窗口。
“食谱”让它看起来好像是在 XAML 本身中实现,没有接触到更广泛的系统。
一个相关的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(使用前将#替换为@)