win32 app中的压克力材料

时间:2017-05-12 07:21:21

标签: uwp dwm acrylic-material fluent-design

微软最近发布了他们新的“流畅”设计语言,其中一部分是"acrylic" material。此效果使元素透明并使背景模糊。它既可以应用于窗口,也可以应用于底层窗户的部分(背景丙烯酸),或窗口中的单个元素,因此其他控件可以通过(应用内丙烯酸)。它在概念上和视觉上非常类似于macOS上的活力。

它是作为XAML中的特殊画笔实现的,但我不知道有没有办法在常规的Win32应用程序中使用它(背景丙烯酸)?效果看起来非常类似于应用于开始菜单和任务栏的模糊(由SetWindowCompositionAttribute处理),这使我相信它可能会被类似的标志激活。

一个子问题:我想知道它是如何实现的?它只是一个可以在窗口上设置的标志,然后应用于DWM(如SetWindowCompositionAttribute,或者像Vista和7中的Aero Glass)?或者UWP是否可以对DWM进行某种控制,并且可以设置着色器来控制它的渲染方式?在Vista下,当DWM首次引入时,它与WPF有共同的代码,它实际上共享(类似DirectX)缓冲区和场景图,所以这样的技巧是可能的。 magifier实用程序可能magnify WPF apps sharply like vector images,但该功能稍后丢失。 MS在该页面上呈现“丙烯酸”的方式(作为不同的层,并实现为XAML画笔),让我认为你必须以某种方式将层注入到DWM场景图中,这会使得使用更难或不可能来自Win32。

4 个答案:

答案 0 :(得分:4)

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

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

Acrylic theme and UWP alike controls in Sciter

uSciter演示浏览器,Windows:

uSciter demo browser, Windows

uSciter演示浏览器,MacOS:

uSciter demo browser, MacOS

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

要在其后面渲染效果,请执行以下操作:

创建带有WS_EX_NOREDIRECTIONBITMAP ex标志的窗口。

来电:

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,用于背景后面的暗模糊。

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

这一切的细节有些晦涩,COM冗长,叹了口气(我是Sciter的作者)。

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

答案 1 :(得分:3)

我刚刚找到了将丙烯酸带到WPF的项目:https://github.com/bbougot/AcrylicWPF

看来你的假设很好。它使用SetWindowsCompositionAttribute并在其上应用着色器。

答案 2 :(得分:2)

它的效果是使用低级XAML组合API创建的,它使用UWP的XAML Compositor,所以我想我怀疑你能够在Win32中本地实现这一点。如果您真的需要它,您可以将您的应用程序跨越桌面桥,转换UI,或使用当前可用的技术模拟效果。 (浏览器,如Chrome,设法使用Window Chrome进一步进入他们的应用程序,虽然我不知道你将如何实现丙烯酸效果。)

答案 3 :(得分:1)

Acrylic Effect Sciter 使用的是使用 SetWindowCompositionAttribute(),目前它是滞后的,但我想出了另一种方法来实现相同的丙烯酸效果,但方法不同。

看看这个Win32 Acrylic Effect using IDComposition and Direct2D

相关问题