微软最近发布了他们新的“流畅”设计语言,其中一部分是"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。
答案 0 :(得分:4)
Sciter 4.2添加了对丙烯酸背景的支持(在Windows和MacOS上):
Sciter中的丙烯酸主题和类似UWP的控件(CSS样式):
uSciter演示浏览器,Windows:
uSciter演示浏览器,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(),目前它是滞后的,但我想出了另一种方法来实现相同的丙烯酸效果,但方法不同。