Win32应用程序中的丙烯酸材料

jdm*_*jdm 4 dwm uwp acrylic-material fluent-design

微软最近透露了他们的新“流畅”设计语言,其中一部分是“丙烯酸”材料。此效果使元素透明并模糊背景。可以将其应用于窗口,以使基础窗口的某些部分可以通过(背景丙烯酸)发光,也可以应用于窗口中的各个元素,以便其他控件可以通过(应用程序内的丙烯酸)发光。从概念和视觉上讲,它与macOS上的活力非常相似。

它在XAML中作为特殊的画笔实现,但我想知道是否可以在常规Win32应用程序中使用它(背景丙烯酸)吗?这种效果看起来与应用于开始菜单和任务栏的模糊效果(由SetWindowCompositionAttribute处理)非常相似,这使我相信可以通过类似的标记将其激活。

一个子问题:我想知道它是如何实现的?仅仅是可以在窗口上设置然后在DWM中应用的标志(例如SetWindowCompositionAttribute或Vista和7中的Aero Glass)吗?还是UWP可以控制DWM,并且可以设置着色器来控制其渲染方式?在Vista下,首次引入DWM时,它与WPF具有通用代码,并且实际上共享(类似于DirectX的)缓冲区和场景图,因此可以实现类似的技巧。magifier实用程序可以像矢量图像一样WPF应用程序急剧放大,但后来该功能丢失了。MS在该页面上显示“丙烯酸”的方式(作为不同的层,并实现为XAML画笔),使我认为您必须以某种方式将层注入DWM场景图中,这将使它变得更难或更不可能使用从Win32。

c-s*_*ile 5

Sciter 4.2增加了对丙烯酸背景的支持(在Windows和MacOS上):

Sciter中的亚克力主题和类似UWP的控件(CSS样式):

Sciter中的丙烯酸主题和UWP控件

Windows版uSciter演示浏览器:

uSciter演示浏览器,Windows

uSciter演示浏览器,MacOS:

uSciter演示浏览器,MacOS

Windows上的Sciter是普通的Win32应用程序(不是UWP)。

为了渲染模糊效果,请执行以下操作:

创建带有WS_EX_NOREDIRECTIONBITMAPex标志的窗口。

来电:

struct WINDOWCOMPOSITIONATTRIBDATA {
  WINDOWCOMPOSITIONATTRIB dwAttrib;
  PVOID                   pvData;
  SIZE_T                  cbData;
};

enum ACCENT_STATE {
  ACCENT_DISABLED = 0,
  ACCENT_ENABLE_GRADIENT = 1,
  ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
  ACCENT_ENABLE_BLURBEHIND = 3,
  ACCENT_ENABLE_ACRYLIC_BLURBEHIND = 4,
  ACCENT_INVALID_STATE = 5
};

ACCENT_POLICY accent = { ACCENT_ENABLE_ACRYLIC_BLURBEHIND, 0, clr, 0 };
WINDOWCOMPOSITIONATTRIBDATA data;
data.dwAttrib = WCA_ACCENT_POLICY;
data.pvData = &accent;
data.cbData = sizeof(accent);
SetWindowCompositionAttribute(get_hwnd(), &data);
Run Code Online (Sandbox Code Playgroud)

clr是AGBR,类似于0xCC000000背景背后的暗模糊。

使用DirectComposition Visual上设置的Direct2D曲面渲染内容,该可视化附加到窗口的交换链,使用 IDXGIFactory2::CreateSwapChainForComposition

所有这一切的细节都有些晦涩和冗长,令人感叹(我是Sciter的作者)。

至少您应该使用Direct2D进行绘制,以渲染类似这样的内容。


Wil*_*ley 2

它的效果是使用较低级别的 XAML 组合 API 创建的,该 API 使用 UWP 的 XAML 合成器,因此我怀疑您是否能够在 Win32 中本机实现此目的。如果您确实想要它,您可以将您的应用程序带到桌面桥上,并转换 UI,或者使用当今可用的技术模仿效果。(Chrome 等浏览器设法将 Window Chrome 进一步引入其应用程序,尽管我不确定如何实现丙烯酸效果)。