帮助获取支持Vista Aero Glass的.Net WinForms应用程序

帮助获取支持Vista Aero Glass的.Net WinForms应用程序,.net,winforms,windows-vista,aero,.net,Winforms,Windows Vista,Aero,要获得.Net窗体的玻璃支持,有两个技巧 我认为这种方法的原始来源如下: 基本上: //reference Desktop Windows Manager (DWM API) [DllImport( "dwmapi.dll" )] static extern void DwmIsCompositionEnabled( ref bool pfEnabled ); [DllImport( "dwmapi.dll" )] static extern int DwmExtendFrameIntoCli

要获得.Net窗体的玻璃支持,有两个技巧

我认为这种方法的原始来源如下:

基本上:

//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上运行——我需要它们优雅地降级。这里有什么最佳实践吗?

没有更简单的方法。这些API还没有被.NET Framework公开,所以唯一的方法是通过某种互操作(或WPF)


至于使用这两个Windows版本,您拥有的代码应该很好,因为在您实际调用函数之前,运行时不会查找DLL的入口点。

DannySmurf说了这一点。您无法通过.NET framework直接“托管”访问这些API(几周前我自己也尝试过)


我最后做了一些肮脏的事。用GDI+创建了我自己的UI。(按钮、圆形标签等)。无论Windows版本如何,它看起来都一样。Win.Forms真的很难看,但这就是你在XP方面得到的一切

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

我想你忘记了设置你想要成为玻璃的区域的透明键。从文章中,

在Windows窗体应用程序中,您可以 只需设置透明键 属性设置为不使用的颜色 在应用程序的其他地方(我使用 盖恩斯博罗,原因是 后来变得明显)。那你可以 创建一个或多个可用的面板 停靠在窗体的边距处,然后 设置面板的背景色 到透明键。现在当你 调用dwmextendframeintoclienterea 玻璃将在其边缘显示 无论你在哪里设置了 适当的透明度关键


您可以使用一种廉价的方法,在窗体上放置一个透明的面板控件,然后将控件放置在其上——黑色将变为黑色。

谢谢,但在SP1之后就不起作用了——看起来框必须是黑色的。