Windows Aero:要绘制什么颜色的“玻璃”?

时间:2009-12-08 21:59:16

标签: windows gdi+ aero dwm

我必须在客户区绘制哪种颜色才能显示 glass

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

DwmExtendFrameIntoClientArea(self.Handle, margins);

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

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

  

Custom Window Frame Using DWM

     

要使扩展帧可见,每个扩展帧的边下面的区域必须包含alpha值为0的像素数据。

更新:以及博文:

  

Windows Vista for Developers – Part 3 – The Desktop Window Manager

     

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

但没有出现玻璃效果:

alt text


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

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

玻璃效果确实出现了:

alt text

然后我认为不透明黑色是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);

alt text

那么世界上究竟发生了什么?在扩展框架区域中绘制的正确颜色是什么,以使玻璃出现?


更新2

使用Adisak的建议来确切地隔离Aero的愚蠢生活的地方,在这里我在黑色圆圈内画一个黑色矩形:

alt text

FillEllipse不支持绘制黑色圆圈吗?


更新3

Pondidum想知道用{strong>透明黑色颜色调用Graphics.Clear是否会使玻璃显示:

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

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

alt text


更新4

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

另见

3 个答案:

答案 0 :(得分: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)得到(几乎)黑色怎么样?

答案 1 :(得分:2)

您上面链接的blog posts之一就此进行了讨论。本机解决方案是使用SetLayeredWindowAttributes将颜色键从黑色切换。

答案 2 :(得分:1)

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

这就是我如何使它无法使我的所有黑色文字透明/玻璃。

我无法弄明白如何在玻璃上画出“发光”的文字。它后面总是有一个黑色矩形。