帮助获得.Net WinForms应用程序以支持Vista Aero Glass

时间:2008-09-17 18:26:40

标签: .net winforms windows-vista aero

为.Net表格提供玻璃支持有一些技巧。

我认为此方法的原始来源是:http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx

基本上:

//reference Desktop Windows Manager (DWM API)
[DllImport( "dwmapi.dll" )]
static extern void DwmIsCompositionEnabled( ref bool pfEnabled );

[DllImport( "dwmapi.dll" )]
static extern int DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset );


//then on form load
//check for Vista
if ( Environment.OSVersion.Version.Major >= 6 )
{
    //check for support
    bool isGlassSupported = false;
    DwmIsCompositionEnabled( ref isGlassSupported );

    if ( isGlassSupported )
        DwmExtendFrameIntoClientArea( this.Handle, ref margins );
...

//finally on print draw a black box over the alpha-ed area
//Before SP1 you could also use a black form background

最后一步是问题 - 在该区域上绘制的任何子控件似乎也将黑色视为alpha透明蒙版。

例如,类区域上的标签条将具有透明文本。

有解决方法吗?

有更简单的方法吗?

我正在处理的应用程序必须在XP和Vista上运行 - 我需要它们才能优雅地降级。这里有最好的做法吗?

5 个答案:

答案 0 :(得分:3)

实际上没有更简单的方法可以做到这一点。 .NET Framework尚未公开这些API,因此唯一的方法是通过某种互操作(或WPF)。

至于使用两个Windows版本,你的代码应该没问题,因为在你实际调用函数之前,运行时不会查找DLL的入口点。

答案 1 :(得分:1)

DannySmurf说道。您没有通过.NET框架直接“管理”访问这些API(几周前我自己尝试过这种方法)。

我最后做了一件令人讨厌的事情。用GDI +创建了我自己的UI。 (按钮,圆形标签等)。无论Windows版本如何,它看起来都一样。 Win.Forms真的很难看,但这就是你所拥有的XP<侧。

答案 2 :(得分:1)

我想你忘了设置你想成为玻璃的区域的TransparencyKey。从文章

  

在Windows窗体应用程序中,您   只需要设置TransparencyKey   属性为您不会使用的颜色   在应用程序的其他地方(我使用   Gainsboro,原因就是这样   后来变得明显)。然后你可以   创建一个或多个面板   停靠在你的表格边缘   设置面板的背景颜色   到透明度键。现在当你   调用DwmExtendFrameIntoClientArea ,.   玻璃将显示在其边缘内   无论你在哪里设置的东西   适当的透明度。

答案 3 :(得分:0)

我不介意非托管调用 - 这是使用黑盒模仿alpha行为的黑客行为,以及它对顶部某些组件中的黑色元素的影响就是问题。

答案 4 :(得分:0)

你可以使用的廉价黑客是在你的表单上放置一个透明的Panel控件并将控件放在它上面 - 然后黑色会变成黑色。