我必须在客户区涂上什么颜色才能使玻璃出现?
我已经把我的表单框架扩展到客户区使用:
DwmExtendFrameIntoClientArea(self.Handle, margins);
我找不到任何官方文档从微软的DWM将寻找什么颜色和/或阿尔法replace玻璃。 DwmExtendFrameInClientArea文档甚至没有提到自定义颜色是必需的。 只有传闻和神话,甚至需要特殊的颜色。
我能find的最接近MSDN的话题是:
使用DWM自定义窗口框架
为了使扩展帧可见,每个扩展帧边下的区域必须具有α值为0的像素数据。
更新:和一个博客文章:
面向开发人员的Windows Vista – 第3部分 – 桌面窗口pipe理器
偶尔,RGB黑色(0x00000000)的位模式与100%透明ARGB的位模式相同,因此您可以使用“黑色”GDI笔刷进行绘制,并假设您已经指示DWM模糊绘制区域,结果将是所需的玻璃效果。
如果我从字面上理解( alpha值为零的像素数据 ),我构build一个零alpha的颜色,并在扩展区域绘制:
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b) e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
但玻璃效果不会出现:
替代文字sof/windows/anlmd4.png
如果我忽略引用的MSDN主题,而是使用完全不透明的黑色(而不是完全透明的黑色):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b) e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
玻璃效果确实出现:
替代文字sof/windows/2ug2ias.png
那么我就会相信不透明的黑色是DWM将用玻璃代替的像素值。
但是,如何在玻璃区域上绘制黑色物品呢?
我已经testing了在玻璃区域画一个黑色的矩形 ,旁边有一个圆圈 。 奇怪的是,矩形不出现,而圆出现; 两个都是一样的颜色:
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);
替代文字sof/windows/aayykk.png
那么世界正在发生什么? 在扩展的边框区域涂上适当的颜色以使玻璃出现?
使用Adisak的build议来隔离航空公司生活中的愚蠢,我在这里画一个黑色的矩形:
替代文字sof/windows/5dw861.png
FillEllipse不支持绘制黑色圆圈吗?
Pondidum想知道如果调用Graphics.Clear 透明的黑色将使玻璃可见:
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
它确实有效,但你仍然不能在玻璃上画出不透明的黑色物品:
替代文字sof/windows/5dw861.png
看着微软的Vista桥梁库 (围绕Vistafunction的托pipe包装,将不会被添加到.NET),他们只能设法使用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)如何得到(几乎)黑色?
您链接到上面的博客文章之一有关于此的讨论。 原生解决方案是使用SetLayeredWindowAttributes
将颜色键从黑色切换开。
尝试将窗体的TransparencyKey设置为Color.FromArgb(1,1,1)(或您选择的某个其他合适的值),然后将窗体的背景颜色(或您想要成为玻璃的部分)设置为相同的值。
这就是我没有使所有的黑色文字透明/玻璃的工作。
我甚至无法弄清楚如何在玻璃上画出“辉煌”的文字。 它后面总是有一个黑色的长方形。