win32应用程序中的亚克力材质

2024-01-11

微软最近展示了他们新的“流畅”设计语言,其中之一就是“亚克力”材质 https://learn.microsoft.com/de-de/windows/uwp/style/acrylic。此效果使元素透明并模糊背景。它可以应用于窗口,以便底层窗口的部分发光(背景丙烯酸),也可以应用于窗口中的各个元素,以便其他控件发光(应用程序内丙烯酸)。它在概念和视觉上与 macOS 上的活力非常相似。

它在 XAML 中作为特殊画笔实现,但我想知道有没有办法在常规 Win32 应用程序中使用它(背景丙烯酸)?该效果看起来与应用于开始菜单和任务栏的模糊非常相似(由设置窗口组合属性 http://withinrafael.com/adding-the-aero-glass-blur-to-your-windows-10-apps/)这让我相信它可能可以通过类似的标志激活。

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


赛特4.2 https://sciter.com/sciter-4-2-support-of-acrylic-theming/添加了对亚克力背景的支持(在 Windows 和 MacOS 上):

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

uSciter 演示浏览器,Windows:

uSciter 演示浏览器,MacOS:

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

为了渲染后面的模糊,它执行以下操作:

创建窗口WS_EX_NOREDIRECTIONBITMAP前国旗。

Calls:

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);

其中 clr 是 AGBR,类似0xCC000000用于背景后面的黑暗模糊。

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

所有这些的细节都有点模糊和 COM 冗长,叹息(我是 Sciter 的作者)。

至少你应该使用 Direct2D 进行绘图,以便呈现这样的东西。

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

win32应用程序中的亚克力材质 的相关文章

随机推荐