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

我必须在客户区涂上什么颜色才能使玻璃出现?

我已经把我的表单框架扩展到客户区使用:

DwmExtendFrameIntoClientArea(self.Handle, margins); 

我找不到任何官方文档从微软的DWM将寻找什么颜色和/或阿尔法replace玻璃。 DwmExtendFrameInClientArea文档甚至没有提到自定义颜色是必需的。 只有传闻和神话,甚至需要特殊的颜色。

我能find的最接近MSDN的话题是:

使用DWM自定义窗口框架

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

更新:和一个博客文章:

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

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

如果我从字面上理解( alpha值为零的像素数据 ),我构build一个零alpha的颜色,并在扩展区域绘制:

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

但玻璃效果不会出现:

替代文字sof/windows/anlmd4.png


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

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

玻璃效果确实出现:

替代文字sof/windows/2ug2ias.png

那么我就会相信不透明的黑色是DWM将用玻璃代替的像素值。

但是,如何在玻璃区域上绘制黑色物品呢?


我已经testing了在玻璃区域画一个黑色的矩形 ,旁边有一个圆圈 。 奇怪的是,矩形出现,而圆出现; 两个都是一样的颜色:

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

替代文字sof/windows/aayykk.png

那么世界正在发生什么? 在扩展的边框区域涂上适当的颜色以使玻璃出现?


更新2

使用Adisak的build议来隔离航空公司生活中的愚蠢,我在这里画一个黑色的矩形:

替代文字sof/windows/5dw861.png

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


更新3

Pondidum想知道如果调用Graphics.Clear 透明的黑色将使玻璃可见:

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

确实有效,但你仍然不能在玻璃上画出不透明的黑色物品:

替代文字sof/windows/5dw861.png


更新4

看着微软的Vista桥梁库 (围绕Vistafunction的托pipe包装,将不会被添加到.NET),他们只能设法使用WPF窗体,而不是WinForms的扩展玻璃框架。

也可以看看

  • 航空:如何在玻璃上绘制ClearType文字?
  • 航空:如何在玻璃上绘制纯色?

Solutions Collecting From Web of "Windows Aero:绘制“玻璃”的颜色是什么颜色?"

 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)如何得到(几乎)黑色?

您链接到上面的博客文章之一有关于此的讨论。 原生解决方案是使用SetLayeredWindowAttributes将颜色键从黑色切换开。

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

这就是我没有使所有的黑色文字透明/玻璃的工作。

我甚至无法弄清楚如何在玻璃上画出“辉煌”的文字。 它后面总是有一个黑色的长方形。