Windows Aero : What color to paint to make "glass" appear?

标签 windows gdi+ aero dwm

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

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

DwmExtendFrameIntoClientArea(self.Handle, margins);

我找不到任何来自 Microsoft 的官方文档,说明 DWM 将寻找什么颜色 和/或alpha 来替换玻璃。关于 DwmExtendFrameInClientArea 的文档甚至没有提到需要自定义颜色。只有传闻和神话甚至需要一种特殊的颜色。

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

Custom Window Frame Using DWM

For the extended frames to be visible, the regions underlying each of the extended frame's sides must have pixel data that has an alpha value of 0.

更新:还有一篇博文:

Windows Vista for Developers – Part 3 – The Desktop Window Manager

It so happens that the bit pattern for RGB black (0x00000000) is the same as the bit pattern for 100% transparent ARGB so you can actually draw with “black” GDI brush and assuming you’ve instructed the DWM to blur the painted area, the result will be the desired glass effect.

如果我按字面意思理解(alpha 值为零的像素数据),我会构造一个 alpha 为零的颜色,并在扩展区域中绘制它:

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

但是没有出现玻璃效果:

alt text


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

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

确实出现了玻璃效果:

alt text

然后我相信不透明的黑色是 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);

alt text

那么世界上到底发生了什么?在扩展框架区域绘制什么颜色才能使玻璃看起来合适


更新2

使用 Adisak的建议,以准确隔离 Aero 的愚蠢所在,这里我在黑色圆圈内画了一个黑色矩形:

alt text

FillEllipse不支持画黑圈吗?


更新3

Pondidum想知道是否打电话 Graphics.Clear使用透明黑色颜色会使玻璃可见:

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

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

alt text


更新4

查看Microsoft's Vista Bridge Library (围绕不会添加到 .NET 的 Vista 功能的托管包装器),他们只设法让扩展的玻璃框架在 WPF 表单上工作,而不是在 WinForms 上工作。

另见

最佳答案

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) 以获得(几乎)黑色怎么样?

关于Windows Aero : What color to paint to make "glass" appear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1870139/

相关文章:

delphi - 使用 Aero 获取 TProgressBar 控件的颜色

c# - 未找到 WPF PresenterFramework.Aero2

windows - Windows 的超时等效值

windows - 改进 Pyspark 中的 Pandas UDF

c# - GDI+ 对象生命周期的最佳策略?

c++ - 在屏幕上旋转矩形

WPF Aero 主题标准样式

windows - 无法创建连接到 Cassandra 的 session

windows - 使用 win32 API 读取 Windows CE 的电池状态

c# - Image.Save() 在从 Stream (Image.FromStream()) 加载的图像上抛出 ExternalException