2010-04-19 67 views
5

在我的应用程序中,我使用DWM API的方法DwmExtendFrameIntoClientArea来调整窗体,以扩展Aero Glass标题栏的高度,以便绘制部分表单客户区在Aero框架上。为了达到这个效果,我还在客户区域的一部分上绘制了一个黑色的矩形,这个矩形在玻璃框架的“上方”,因此许多在线文章都表示它看起来很透明。这在Windows Vista/Windows 7下运行得非常好,但是当我下载VS 2010并使用.NET Framework 4.0作为构建我的应用程序的增强框架时,此方法不再有效。问题在于黑色矩形是可见的,即在Aero玻璃上绘制时黑色不再被认为是透明的。有没有人有一个想法,可能是什么问题,以及如何克服?.NET Framework 4.0和在Aero Glass上的绘图问题

+0

Aero glass works on Windows 7?我认为这只适用于Windows Vista上的DWM。 – Svisstack 2010-04-19 11:40:46

+2

@Svisstack:是的;航空玻璃在Windows 7上工作。 – SLaks 2010-04-19 11:44:11

+0

是的,它的工作原理。什么不起作用,就像我以前使用早期版本的.NET时所做的那样(<4.0) – WorldIntruder 2010-04-19 11:46:03

回答

0

请原谅我,如果这是无益的,但它可能只是改变了他们的调色板?很多时候,这些窗口interop类型的API似乎除了默认的调色板之外还可以使用PBGRA调色板,并且它们的默认颜色调色板可能已经从一个框架版本更改为另一个。它应该很简单,以测试这是否正确。我发现了一个类似的渲染硬件游标的问题,在某些情况下,透明和黑色会被混淆,最终结果是我错误地计算了PBGRA,所以BGR中的一个比A更大,这可能会对你的背景应该是透明的颜色。)

使用DWM API方法还有其他一些问题。我并不完全确定,但是从记忆来看,设置新边距有一些复杂性 - 如果我没有记错,它们都需要有相同的符号(+/- )或工件(例如突然出现的黑色背景)有时出现。

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()); 
}