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

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

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

有没有解决的办法?

有没有更简单的方法来做到这一点?

我正在处理的应用程序必须同时在 XP 和 Vista 上运行——我需要它们优雅地降级。这里有什么最佳实践吗?

4

5 回答 5

3

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

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

于 2008-09-17T18:30:30.857 回答
1

丹尼蓝精灵说了算。通过 .NET 框架,您没有对这些 API 的直接“托管”访问权限(几周前我自己尝试过)。

我最终做了一件令人讨厌的事情。使用 GDI+ 创建了我自己的 UI。(按钮、圆形标签等)。无论 Windows 版本如何,它看起来都一样。Win.Forms 真的很丑,但这就是你在 XP < 方面得到的全部。

于 2008-09-17T18:33:23.580 回答
1

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

在您的 Windows 窗体应用程序中,您只需将 TransparencyKey 属性设置为您不会在应用程序其他地方使用的颜色(我使用 Gainsboro,原因将在稍后变得明显)。然后,您可以创建一个或多个停靠在表单边缘的面板,并将面板的背景颜色设置为透明度键。现在,当您调用 DwmExtendFrameIntoClientArea 时,只要您设置了适当的透明度键,玻璃就会显示在其边距内。

于 2008-09-17T18:49:01.500 回答
0

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

于 2008-09-17T18:36:09.080 回答
0

您可以使用的一个便宜的技巧是在您的表单上放置一个透明的面板控件并将您的控件放在上面——黑色将变为黑色。

于 2009-07-09T16:32:21.810 回答