Windows 7 .NET Framework 4.0和关于Aero玻璃问题的图纸

Windows 7 .NET Framework 4.0和关于Aero玻璃问题的图纸,windows-7,.net-4.0,aero,Windows 7,.net 4.0,Aero,在我的应用程序中,我使用DWM API的方法DwmExtendFrameIntoClientArea调整了一个表单,以扩展Aero Glass标题栏的高度,从而在Aero框架上绘制部分表单客户端区域。为了达到这个效果,我还画了一个黑色的矩形在客户区的一部分,这是'超过'的玻璃框架,使它看起来透明,正如许多在线文章所建议的。这在WindowsVista/Windows7下运行得很好,但当我下载VS2010并使用.NETFramework4.0作为我的trarget框架来构建我的应用程序时,这种方法

在我的应用程序中,我使用DWM API的方法DwmExtendFrameIntoClientArea调整了一个表单,以扩展Aero Glass标题栏的高度,从而在Aero框架上绘制部分表单客户端区域。为了达到这个效果,我还画了一个黑色的矩形在客户区的一部分,这是'超过'的玻璃框架,使它看起来透明,正如许多在线文章所建议的。这在WindowsVista/Windows7下运行得很好,但当我下载VS2010并使用.NETFramework4.0作为我的trarget框架来构建我的应用程序时,这种方法不再有效。问题是黑色矩形是可见的,即在航空玻璃上绘制时,黑色不再被视为透明。有人知道这可能有什么问题,以及如何克服吗?

如果这没有帮助,请原谅我,但有可能他们只是改变了调色板?通常情况下,这些windows互操作类型API除了使用默认调色板外,还可以使用PBGRA调色板,并且它们的默认调色板可能已从一个框架版本更改为另一个框架版本。它应该足够简单,以测试这是否是真的

(我在渲染硬件光标时发现了一个类似的问题,在某些情况下,透明和黑色会混淆。最终结果是我错误地计算了PBGRA,因此BGR中的一个大于a,这可能适用于透明颜色的背景。)


使用DWM API方法还存在其他并发症。我不完全确定,但根据记忆,设置新的边距有些复杂——如果我没记错的话,它们都需要有相同的符号(+/-)或工件(例如突然出现的黑色背景)。

这个问题的答案如下所述:C#的解决方案

从链接页面摘录(如果链接已关闭):

在窗口上使用玻璃作为背景有点棘手。如果渲染任何自然不透明的对象(如GDI函数),您将在玻璃上渲染项目,尽管有时会产生意外的结果。如果你想真正的渲染到玻璃表面,你需要利用的功能,利用alpha通道的颜色,如GDI+,Windows演示基础,或WindowsXP主题API。 一个特别的问题是,以黑色呈现GDI项使用位模式0x00000000,如果使用alpha通道,它也恰好是完全透明的黑色。这意味着,如果你用黑色GDI画笔或钢笔画画,你会得到一个透明的颜色,而不是黑色。这带来的最大问题是当您尝试在位于玻璃区域的文本标签控件中使用默认文本颜色时。由于默认文本颜色通常为黑色,所以DWM将认为这是透明的,并且文本将被错误地写入玻璃。

WinForms的解决方案:

幸运的是,有很多方法可以解决这个问题。使用所有者绘制控件是其中之一。渲染到具有alpha通道的位图是另一种方法。幸运的是,获取控件文本的最简单方法是让.NETFramework2.0为您使用GDI+。这可以通过在控件上设置UseCompatibleTextRendering属性轻松实现。默认情况下,此属性设置为false,以便为早期版本的.NET Framework编写的控件将呈现相同的属性。但是如果你把它设置为true,你的文本就会看起来是正确的。可以使用Application.SetUseCompatibleTextRenderingDefault方法全局设置属性。如果您使用的是Visual Studio®2005,则在创建表单之前,模板代码将在主例程中包含一个将兼容文本呈现设置为false的调用。您只需编辑它,将其设置为true,如下所示,当您将所有控件写入玻璃窗口时,它们看起来都是正确的


Aero玻璃在Windows7上工作?我认为这只适用于Windows Vista上的widh DWM。@Svisstack:是的;Aero Glass在Windows7上工作。是的,它工作得很好。不起作用的是我在使用早期版本的.NET时使用的方式(@Svisstak你见过Windows 7吗?它显然有Aero玻璃(尽管我知道可能会有一些风格上的变化)。
static void Main()
{
    Application.EnableVisualStyles();

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

    Application.Run(new GlassForm());
}