在我的应用程序中,我有一个表单,我通过使用DWM API的方法DwmExtendFrameIntoClientArea进行调整,以扩展Aero Glass标题栏的高度,以便在Aero框架上绘制部分表单客户区。为了达到这个效果,我还在客户区域的一部分上绘制了一个黑色矩形,这个矩形在玻璃框架上方,因此它看起来很透明,正如许多在线文章所暗示的那样。这在Windows Vista / Windows 7下运行良好但是当我下载VS 2010并使用.NET Framework 4.0作为我的trarget框架来构建我的应用程序时,这种方法不再有效。问题是黑色矩形是可见的,即在Aero玻璃上绘制时黑色不再被认为是透明的。有没有人知道这可能有什么问题以及如何克服它?
答案 0 :(得分:1)
这里描述了这个问题的答案:http://msdn.microsoft.com/en-us/magazine/cc163435.aspx#S6包含C#的解决方案。
摘自链接页面(如果链接已关闭):
在窗户上使用玻璃作为背景有点棘手。如果您渲染任何天然不透明的东西(例如GDI函数),您将在玻璃上渲染您的项目,但有时会产生意外结果。如果要将渲染实际混合到玻璃表面,则需要利用利用颜色的Alpha通道的功能,例如GDI +,Windows Presentation Foundation或Windows XP Theme API。
一个特别的问题是,渲染黑色的GDI项目使用位模式0x00000000 - 如果您使用的是Alpha通道,它也恰好是完全透明的黑色。这意味着如果您使用黑色GDI画笔或笔绘制,您将获得透明色,而不是黑色。这个问题最大的问题是当您尝试在位于玻璃区域的文本标签的控件中使用默认文本颜色时。由于默认文本颜色通常为黑色,因此DWM会将其视为透明,并且文本将被错误地写入玻璃中。
WinForms的解决方案:
令人高兴的是,有很多方法可以解决这个问题。使用所有者绘制控件是一个。渲染到具有Alpha通道的位图是另一种。幸运的是,获取控件文本的最简单方法是让.NET Framework 2.0为您使用GDI +。通过在控件上设置UseCompatibleTextRendering属性可以轻松完成此操作。默认情况下,此属性设置为false,以便为以前版本的.NET Framework编写的控件将呈现相同的内容。但是如果你把它设置为true,那么你的文字会看起来正确。您可以使用Application.SetUseCompatibleTextRenderingDefault方法全局设置该属性。如果您使用的是VisualStudio®2005,则模板代码将包含一个调用,以便在创建表单之前在主例程中将兼容的文本呈现设置为false。您可以编辑它以将其设置为true,如下所示,并且当您在玻璃窗口上书写时,所有控件看起来都是正确的。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue
Application.Run(new GlassForm());
}
答案 1 :(得分:0)
请原谅我,如果这是无益的,但他们是否可能只是改变了他们的调色板?通常看起来那些窗口互操作类型API除了默认调色板外还可以使用PBGRA调色板,并且它们的默认调色板可能已经从一个框架版本更改为另一个框架版本。它应该足够简单,以测试这是否真实。
(我发现了渲染硬件游标的类似问题,在某些情况下,透明和黑色会混淆。最终结果是我错误地计算了PBGRA,因此BGR中的一个大于A,这可能是你的背景意味着透明色。)
使用DWM API方法还有其他一些问题。我不完全确定,但是从内存来看,设置新的边距有一些复杂的东西 - 如果我没记错的话,它们都需要有相同的符号(+ / - )或工件(例如你突然出现的黑色背景)有时会出现。