我必须在客户区涂上什么颜色才能制作玻璃?
我使用以下方法将表单框架扩展到客户区:
DwmExtendFrameIntoClientArea(self.Handle, margins);
Run Code Online (Sandbox Code Playgroud)
我找不到微软的官方文档,说明DWM用玻璃代替什么颜色和/或alpha.DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色.只有传闻和神话,甚至需要特殊的颜色.
我能找到的最接近的是MSDN上的主题:
使用DWM的自定义窗口框架
为了使扩展帧可见,每个扩展帧的边下面的区域必须具有alpha值为0的像素数据.
更新:和博客文章:
Windows Vista for Developers - 第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);
Run Code Online (Sandbox Code Playgroud)
但玻璃效果没有出现:
替代文字http://i46.tinypic.com/anlmd4.png
如果我忽略引用的MSDN主题,而是使用完全不透明的黑色(而不是完全透明的黑色):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)
玻璃效果确实出现了:
alt text http://i45.tinypic.com/2ug2ias.png
然后我开始相信不透明的黑色是DWM用玻璃代替的像素值.
但那我如何在玻璃区域上画黑色物品呢?
我测试过在玻璃区域上画一个黑色矩形,旁边有一个圆圈.奇怪的是,矩形没有出现,而圆圈确实出现; 两者颜色相同:
Brush …Run Code Online (Sandbox Code Playgroud) 我很困惑Delphi 2009/2010对Windows中Aero Theme Glass功能的支持,以及DoubleBuffered的含义,以及与Aero glass有什么关系.我发现DoubleBuffered不仅是VCL中的一个属性,它也可以在.net WinForms中找到.最初我想知道它是否设置了公共控件库使用的某种窗口样式位,或者是什么.它为什么使用,何时使用?
[更新:我应该说我知道什么是"双缓冲",作为减少闪烁的一般技术,我想知道的是,为什么它与在Windows Vista中的Aero Glass窗格上渲染控件有任何关系? Windows 7,特别是为什么所有东西的按钮需要双缓冲设置为真,才能在玻璃上工作?下面链接的博客文章似乎最有用.]
特别是,我对DoubleBuffered属性感到困惑,我想知道它为什么存在,以及它在窗体和控件中的玻璃支持和双缓冲属性之间的关系是什么.当您阅读像这样的C++文章时,您会发现没有提到双缓冲.
[更新2:以下内容包含一些事实错误,并已修改:]
我发现一些C++开发人员正在讨论他们如何调用SetLayeredWindowAttributes以避免DWM/Aero合成导致的"黑色变成玻璃"故障,当你在经典的Win32应用程序中打开它时[但是下面的博客链接告诉我这不再起作用在Windows 7中,实际上只在Vista中短暂工作,直到微软阻止它].[开始错误的想法]我们不应该使用其他颜色,如明亮的洋红色,并使其变成玻璃透明色?[结束错误的想法]
什么时候应该设置和不设置DoubleBuffered的规则,以及为什么DoubleBuffered首先添加到VCL?设置什么时候会引起问题?(看来远程桌面是一种情况,但这是唯一的情况吗?)当它没有设置时,我们会搞清楚按钮文本的渲染,很可能是因为看起来Delphi没有改变默认的"渲染黑色如玻璃"在Aero DWM中.
在我看来,Aero Glass渲染基本上是以奇怪或难以理解的方式进行的[由Windows本身,而不是仅仅包含此功能的Delphi],以及2009/2010年的许多内部VCL源代码StdCtrls中的类必须做很多复杂的逻辑才能正确地在Aero Glass上呈现内容,但它仍然存在很多问题,并且看起来像是错误的,并且这可能是这个相关问题和qc问题的背后. [更新3:玻璃上的很多渲染故障,在VCL中在常见控件中渲染错误,看起来,微软并不关心修复.简而言之,Delphi VCL代码修复无法解决这样一个事实:古老的Windows通用控件库和现代[但奇特的] Aero Glass合成功能彼此不太相似,并且不能特别合作.感谢微软建立如此高质量的技术,并将其释放到世界各地.
如果它还不够有趣; 为什么我们有ParentDoubleBuffered?
[7月30日更新:这个问题对我很有意思,因为我认为它表明,当你拥有一个庞大的现有VCL框架时,使用Windows API解决这个问题是一个很难的问题.