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

Ian*_*oyd 30 windows gdi+ aero dwm

我必须在客户区涂上什么颜色才能制作玻璃

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

DwmExtendFrameIntoClientArea(self.Handle, margins);
Run Code Online (Sandbox Code Playgroud)

我找不到微软的官方文档,说明DWM用玻璃代替什么颜色和/或alpha.DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色.只有传闻和神话,甚至需要特殊的颜色.

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

使用DWM的自定义窗口框架

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

更新:和博客文章:

Windows Vista for Developers - 第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);
Run Code Online (Sandbox Code Playgroud)

但玻璃效果没有出现:

替代文字http://i46.tinypic.com/anlmd4.png


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

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

玻璃效果确实出现了:

alt text http://i45.tinypic.com/2ug2ias.png

然后我开始相信不透明的黑色是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);
Run Code Online (Sandbox Code Playgroud)

替代文字http://i49.tinypic.com/aayykk.png

那么世界上究竟发生了什么?在延长的框架区域涂漆以使玻璃出现的正确颜色是什么?


更新2

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

替代文字http://i47.tinypic.com/5dw861.png

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


更新3

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

e.Graphics.Clear(Color.FromArgb(0,0,0,0));
Run Code Online (Sandbox Code Playgroud)

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

替代文字http://i47.tinypic.com/5dw861.png


更新4

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

也可以看看

Dan*_*röm 2

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

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

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

  • 我想我可以画出一种不是我想要的颜色,但我宁愿画出我想要的颜色。 (3认同)