我必须在客户区绘制哪种颜色才能显示 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);
但没有出现玻璃效果:
如果我忽略引用的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);
那么世界上究竟发生了什么?在扩展框架区域中绘制的正确颜色是什么,以使玻璃出现?
使用Adisak的建议来确切地隔离Aero的愚蠢生活的地方,在这里我在黑色圆圈内画一个黑色矩形:
FillEllipse不支持绘制黑色圆圈吗?
Pondidum想知道用{strong>透明黑色颜色调用Graphics.Clear是否会使玻璃显示:
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
确实有效,但您仍然无法在玻璃上绘制不透明的黑色物品:
看看Microsoft's Vista Bridge Library(围绕Vista功能的托管包装器,不会添加到.NET),他们只能设法在WPF表单上使用扩展的玻璃框架,而不是WinForms。
答案 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)(或您选择的其他一些合适的值),然后将表单的背景颜色(或您想要成为玻璃的部分)设置为相同的价值。
这就是我如何使它无法使我的所有黑色文字透明/玻璃。
我无法弄明白如何在玻璃上画出“发光”的文字。它后面总是有一个黑色矩形。