.NET Framework 4.0和在Aero Glass上绘图的问题

5
在我的应用程序中,我有一个表单,通过使用DWM API的方法DwmExtendFrameIntoClientArea来调整它,以扩展Aero Glass标题栏的高度,以便我的表单客户端区域的一部分绘制在Aero框架上。为了实现这种效果,我还在客户端区域的“覆盖”玻璃框架的部分绘制了一个黑色矩形,以使其看起来透明,正如许多在线文章所建议的那样。这在Windows Vista / Windows 7下运行得非常好,但是当我下载VS 2010并使用.NET Framework 4.0作为我的目标框架构建应用程序时,这种方法不再有效。问题在于黑色矩形是可见的,即在Aero玻璃上绘制时,黑色不再被认为是透明的。是否有人知道可能出了什么问题,以及如何克服它?

Aero Glass 在 Windows 7 上能用吗?我认为这只适用于 Windows Vista 上的 DWM。 - Svisstack
2
@Svisstack:是的,Aero Glass可以在Windows 7上运行。 - SLaks
是的,它可以工作。不起作用的是以前版本的.NET(<4.0)中使用的绘图方式。 - WorldIntruder
@Svisstak,你看过Windows 7吗?它显然有Aero Glass(尽管我明白可能会有一些小的风格变化)。 - Jonathan Sterling
2个回答

1

这个问题的答案在这里描述:http://msdn.microsoft.com/en-us/magazine/cc163435.aspx#S6 ,并给出了 C# 的解决方案。

以下是链接页面的摘录(如果链接无法访问):

在窗口上使用玻璃作为背景有点棘手。如果您渲染任何自然不透明的东西(例如GDI函数),则会在玻璃上呈现您的项目,但有时会出现意外的结果。如果您想将渲染实际混合到玻璃表面中,则需要利用利用颜色的alpha通道的功能,例如GDI+、Windows Presentation Foundation或Windows XP主题API。
一个特别需要注意的问题是,在黑色中渲染GDI项使用的是位模式0x00000000,这也恰好是完全透明的黑色,如果您正在使用alpha通道。这意味着,如果您使用黑色的GDI画刷或笔进行绘制,您将得到透明的颜色,而不是黑色。这带来的最大问题是,当您尝试在文本标签控件的玻璃区域中使用默认文本颜色时。由于默认文本颜色通常是黑色,因此DWM将认为这是透明的,并且文本将被错误地写入玻璃中。
WinForms的解决方案如下:
高兴的是,有许多方法可以解决这个问题。使用自绘控件是其中之一。渲染到具有 alpha 通道的位图是另一种方法。幸运的是,让 .NET Framework 2.0 为您使用 GDI+ 是获得控件文本的最简单方法。这可以通过设置控件上的 UseCompatibleTextRendering 属性轻松实现。默认情况下,此属性设置为 false,以便为先前版本的 .NET Framework 编写的控件呈现相同。但是,如果将其设置为 true,则文本将正确显示。您可以使用 Application.SetUseCompatibleTextRenderingDefault 方法全局设置该属性。如果您正在使用 Visual Studio® 2005,则模板代码将在创建窗体之前的主例程中包括一个调用以将兼容的文本呈现设置为 false。您只需像下面所示那样将其编辑为 true,所有控件都将在玻璃窗口上正确显示。
static void Main()
{
    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue

    Application.Run(new GlassForm());
}

0

如果我的回答没有帮上忙,请谅解。他们是否只是更改了颜色调色板呢?通常,似乎这些窗口互操作的API可以使用PBGRA调色板,除了它们的默认调色板外,它们的默认颜色调色板也可能从一个框架版本更改为另一个版本。测试这一点应该很简单。

我曾遇到过渲染硬件光标的类似问题,在某些情况下会混淆透明和黑色。最终发现是我在计算PBGRA时出了误差,使得BGR中的一个大于A,这可能也是您背景本应该透明的颜色的问题。

使用DWM API方法还有其他的复杂因素。我不太确定,但从记忆深处来看,设置新边距有些复杂——如果我没有记错的话,所有的边距都需要具有相同的符号(+ / -),否则就会出现一些意想不到的结果(比如突然出现的黑色背景)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接