为了使玻璃出现,我必须在客户区涂上什么颜色?
我已经使用以下方法将表单的框架扩展到客户区:
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。