在Win32应用程序中模仿丙烯酸

Dav*_*vid 11 windows winapi dwm

微软最近宣布了Fluent Design中的玻璃状材料Acrylic.它仅作为XAML/UWP呈现,但看起来非常类似于玻璃,除了它可以任意着色并且可以应用于应用程序中的天桥控件以及应用程序的独立窗口.

'配方'使它看起来好像是在XAML中实现的,而不是暴露在更广泛的系统中.

微软制作丙烯酸的配方:背景,蓝色,混合,色调,噪音

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

如何在一个普通的Win32应用程序中模仿这个? 用玻璃和混合?(哪些API,以及Win7中不存在的Win10 Fall Update的玻璃API有哪些?)如果应用程序是使用Win32创建的,但使用DirectX表面进行渲染,是否会打开更多可能性?

jdm*_*jdm 7

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

一点点历史:借助Vista,微软推出了桌面窗口管理器DWM,它是桌面的合成引擎.使用DWM,窗口绘制到纹理,然后在DWM中组合.好处是您可以获得3D动画,透明度等奇特效果,并且所有内容都是双缓冲的,因此您无法获得渲染工件.

DWM最初是基于MIL(媒体集成层),我认为这是一个场景图API.有趣的是,那时推出的WPF也使用了MIL.这真的很酷,因为DWM可以看到WPF窗口的场景图,当它会如此影响时,例如放大窗口,它会将其视为向量而不是位图,因此它可以在没有工件的情况下进行缩放.但是,微软在某些时候分叉了WPF中使用的MIL版本,并且这种集成丢失了.

快进几年到Windows 8.微软推出了新的"Metro"应用程序(后来的"现代",现在是"UWP").在幕后,这些现代应用程序使用新的组合API,DirectComposition.此API也适用于Win32应用程序,现在由DWM本身使用.如果你看一下公共DWM函数,那些与MIL相关的函数已被弃用,因此它支持我的理论,即MS从MIL转向DC.因此,现在我们再次处于初始状态,即应用程序和DWM使用相同的基础架构,我们可以轻松添加一些有趣的效果.

在某些时候,MS已经为IDCompositionDevice3接口提供的DirectComposition引入了新的混合效果.其中包括高斯模糊效果,还有噪音,色调和其他必要的效果.我找到了一种窗口中应用这些效果的方法,但我不知道如何将它们应用我的窗口.不幸的是,我现在无法访问我的代码,当我这样做时,我会更新我的答案.

我的研究基于Efficient Alpha-Blended Windows:DirectComposition这篇文章.基本上,您有一个与屏幕对应的"设备",以及与您的窗口内容对应的"视觉".你需要改变的是:

  • 您的设备可以为您创建效果.记住QueryInterfaceIDCompositionDevice3.
  • 然后,你可以打电话SetEffect给你IDCompositionVisual3.

但是,正如我所说,这仅适用于窗口内容.我认为必须有一个秘密API来从DWM获取当前窗口的父Visual,然后它应该只是调用SetEffectVisual来获得效果.如果某人熟练使用调试器,则应该可以通过跟踪使用Acyllic效果的UWP应用程序来找到该API.

作为一个蓝色的镜头,我会看看GetWindowCompositionAttribute函数.它最近获得了一些有趣的声音标志,例如WCA_VISUAL_OWNER.


zet*_*t42 5

我认为可以使用Win32 API来模仿它,或者至少创建接近结果。

  • 可以使用SetWindowCompositionAttribute()已链接的undocumented实现模糊和着色。DWM必须提供此功能,即使对于XAML实现,也确实如此。
  • 我不确定排除混合应该做什么,至少从MS页面上按比例缩小的屏幕截图来看,它似乎是可忽略的。
  • 噪声纹理应该简单易行,因为它可能只是混合了alpha噪声...好吧。使用随机发生器还是perlin噪声函数

您还可以查看Direct Composition(可能与WS_EX_NOREDIRECTIONBITMAP 扩展的窗口样式结合使用),如文章“ 使用Windows Composition Engine的高性能窗口分层 ”中所述。我还没有使用过这项技术,但是文章指出XAML基于Direct Composition,应该会打开所有可能性。


mag*_*981 5

自Windows 10 v1803起(内部版本17134.x-RS4-2018年4月更新),Rafael Rivera发布了一个小型演示应用程序如何在桌面应用程序中使用Acrylic Blur

在此处输入图片说明

基本上,enum AccentState有一个新条目ACCENT_ENABLE_ACRYLICBLURBEHIND = 4