在我的应用程序中,我有一个表单,我通过使用 DWM API 的方法 DwmExtendFrameIntoClientArea 来扩展 Aero Glass 标题栏的高度,以便在 Aero 框架上绘制我的表单客户区的一部分。为了达到这种效果,我还在客户区域的“玻璃框架上方”部分绘制了一个黑色矩形,使其看起来透明,正如许多在线文章所建议的那样。这在 Windows Vista/Windows 7 下运行良好,但当我下载 VS 2010 并使用 .NET Framework 4.0 作为我的目标框架来构建我的应用程序时,这种方法不再有效。问题是黑色矩形是可见的,即在 Aero 玻璃上绘图时黑色不再被认为是透明的。有谁知道这可能有什么问题以及如何克服?
2 回答
此处描述了此问题的答案: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 方法全局设置属性。如果您使用的是 Visual Studio® 2005,则模板代码将包括在创建表单之前在主例程中将兼容的文本呈现设置为 false 的调用。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue
Application.Run(new GlassForm());
}
如果这没有帮助,请原谅我,但他们是否有可能只是改变了他们的调色板?除了默认调色板之外,这些 windows 互操作类型 API 似乎还可以使用 PBGRA 调色板,并且它们的默认调色板可能已经从一个框架版本更改为另一个框架版本。测试这是否正确应该足够简单。
(我在渲染硬件光标时发现了一个类似的问题,透明和黑色在某些情况下会混淆。最终证明是我错误计算了 PBGRA,因此 BGR 之一大于 A,这可能是你的背景应该是透明的颜色。)
使用 DWM API 方法还有其他复杂性。我不完全确定,但根据记忆,设置新边距有些复杂 - 如果我没记错的话,它们都需要具有相同的符号(+ / -)或伪影(例如你突然出现的黑色背景)有时出现。