【发布时间】:2010-12-24 14:48:37
【问题描述】:
我必须在客户区涂上什么颜色才能使 玻璃 出现?
我已使用以下方法将表单的框架扩展到客户区:
DwmExtendFrameIntoClientArea(self.Handle, margins);
我找不到任何来自 Microsoft 的官方文档,说明 DWM 将寻找什么 color 和/或 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 值为 0 的像素数据),我会构造一个 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's Vista Bridge Library(围绕不会添加到 .NET 的 Vista 功能的托管包装器),他们只能设法让扩展玻璃框架在 WPF 表单上工作,而不是在 WinForms 上工作。
另见
【问题讨论】:
-
这可能正确也可能不正确,但从您的测试中可以看出,不透明的黑色矩形可能会以航空效果呈现。您可以尝试在黑色椭圆的中间渲染一个不透明的黑色矩形,看看它是否是透明的。
-
要画黑色不透明的东西,可以试试 254,0,0 吗?
-
@karoberts:你的意思是 (254, 0,0,0),因为 (254,0,0) 是红色的。
-
@Ian:是的,我的意思是(1,1,1),略高于纯黑色
-
我看到一个红色像素,我想把它涂成黑色。