31

为了使玻璃出现,我必须在客户区涂上什么颜色?

我已经使用以下方法将表单的框架扩展到客户区:

DwmExtendFrameIntoClientArea(self.Handle, margins);

我找不到任何来自 Microsoft 的官方文档,说明 DWM 将寻找什么颜色和/或alpha来替换玻璃。DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色。只有传闻和神话甚至需要特殊的颜色。

我能找到的最接近的是 MSDN 上的一个主题:

使用 DWM 自定义窗框

为了使扩展帧可见,每个扩展帧边下的区域必须具有 alpha 值为 0 的像素数据。

更新:还有一篇博文:

面向开发人员的 Windows Vista – 第 3 部分 – 桌面窗口管理器

碰巧 RGB 黑色 (0x00000000) 的位模式与 100% 透明 ARGB 的位模式相同,因此您实际上可以使用“黑色”GDI 画笔进行绘制,并假设您已指示 DWM 模糊绘制区域,结果将是所需的玻璃效果。

如果我从字面上理解他们所说的(alpha 值为零的像素数据),我会构造一个 alpha 为零的颜色,并在扩展区域中绘制它:

Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

但没有出现玻璃效果:

替代文字


如果我忽略引用的 MSDN 主题,而是使用完全不透明的黑色(而不是完全透明的黑色):

Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

玻璃效果确实出现了:

替代文字

然后我被引导相信不透明的黑色是 DWM 将寻找用玻璃替换的像素值。

但是,我如何在玻璃区域上涂黑色物品?


我已经测试在玻璃区域上画一个黑色矩形,旁边有一个圆圈。奇怪的是,矩形没有出现,而圆形却出现了;两者都是相同的颜色:

Brush b = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
e.Graphics.FillRectangle(b, 11, 11, 32, 32);
e.Graphcis.FillEllipse(b, 43, 11, 32, 32);

替代文字

那么世界上到底发生了什么?在扩展框架区域涂上什么颜色才能使玻璃出现?


更新 2

使用Adisak的建议来准确隔离 Aero 的愚蠢之处,在这里我在黑色圆圈内绘制了一个黑色矩形:

替代文字

FillEllipse 不支持画黑圈吗?


更新 3

Pondidum想知道使用透明黑色调用Graphics.Clear是否会使玻璃可见:

e.Graphics.Clear(Color.FromArgb(0,0,0,0));

确实有效,但您仍然无法在玻璃上绘制不透明的黑色物品:

替代文字


更新 4

查看Microsoft 的 Vista Bridge 库(围绕不会添加到 .NET 的 Vista 功能的托管包装器),他们只能设法让扩展玻璃框架在 WPF 表单上工作,而不是 WinForms。

也可以看看

4

3 回答 3

2

您在上面链接到的一篇博客文章对此进行了讨论。本机解决方案是用于SetLayeredWindowAttributes将颜色键从黑色切换。

于 2009-12-09T20:54:03.530 回答
2
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

这实际上是相当有趣的。这意味着您正在绘制完全透明的东西 - 所以这绝对不会改变!:-)

猜想:如果黑色 (0,0,0) 应该表示“玻璃”,那么绘制 (1,1,1) 以获得(几乎)黑色怎么样?

于 2009-12-09T10:00:35.313 回答
1

尝试将表单的 TransparencyKey 设置为 Color.FromArgb(1,1,1) (或您选择的其他合适的值),然后将表单的背景色(或您想要成为玻璃的部分)设置为相同的值。

这就是我如何让它工作而不会使我所有的黑色文本透明/玻璃。

不过,我一直想不通如何在玻璃上画出“发光”的文字。它后面总是有一个黑色的矩形。

于 2009-12-09T20:46:46.770 回答