帮助让 .Net WinForms 应用程序支持 Vista Aero Glass

4

有几个技巧可以让.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

那最后一步是问题所在 - 在那个区域上绘制的任何子控件似乎也会将黑色作为透明度蒙版。例如,覆盖类区域的选项卡条将具有透明文本。有没有什么解决方法?有没有更简单的方法?我正在处理的应用程序必须在XP和Vista上运行 - 我需要它们能够优雅地降级。这里有什么最佳实践吗?
5个回答

3

这实在是没有更简单的方法了。.NET Framework尚未公开这些API,因此唯一的方法是通过某种互操作方式(或WPF)。

至于与两个Windows版本一起使用,您现有的代码应该是可以的,因为运行时直到您实际调用函数才会寻找DLL的入口点。


1

DannySmurf 说了这件事。虽然我几周前试过,但你无法直接“管理”这些API的访问.NET框架。

最终我做了一些肮脏的事情。使用GDI+创建了自己的UI。(按钮,圆形标签等)。它的外观不受Windows版本影响。Win.Forms真的很丑,但这是您在XP<侧得到的全部内容。


1

我觉得你忘记设置要变为玻璃效果的区域的透明关键字。从文章中可以看到:

在你的Windows Forms应用程序中,你只需要将TransparencyKey属性设置为应用程序中不会使用的颜色(我用Gainsboro,后面的原因会变得很明显)。然后你可以创建一个或多个停靠在窗体边缘的面板,并将面板的背景颜色设置为透明关键字。现在当你调用DwmExtendFrameIntoClientArea时,玻璃效果将显示在其边距内,无论你在适当透明关键字处设置了什么。


谢谢,但在安装了SP1之后它不起作用-看起来这个框必须是黑色的。 - Keith

0
一个便宜的技巧是在窗体上放置一个透明的面板控件,并在其上放置您的控件 - 这样黑色就会是黑色。

0

我不介意未经管理的调用 - 问题在于使用黑盒子来模拟 alpha 行为并对顶部某些组件中的黑色元素产生影响。


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