2008-09-17 66 views
4

获得.Net窗体的玻璃支持有几个技巧。帮助获取.Net WinForms应用程序以支持Vista Aero Glass

我想起了当初源出于此方法是在这里: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上都能正常工作 - 我需要它们适度地降级。这里有最佳做法吗?

回答

3

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

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

1

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

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

0

我不介意非托管调用 - 这是使用黑盒来模仿alpha行为和它对黑色元素的影响的黑客攻击。

1

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

在您的Windows窗体应用程序,你 只需将TransparencyKey 属性设置为您不会在应用程序中使用 其他地方的颜色(我用 亮灰,其原因将后来变得明显)。然后,您可以创建一个或多个面板,其中 停靠在窗体边缘, 将面板 的背景颜色设置为透明键。现在,当您拨打DwmExtendFrameIntoClientArea时, 玻璃将在其边距 内显示,无论您设置了哪些 合适的透明度键。

+0

谢谢,但这不适用于SP1后 - 它看起来像框必须是黑色的。 – Keith 2008-09-18 10:53:40

0

一个便宜的黑客可以使用的是放置一个透明的面板控制在你的窗体上,并把它放在你的控制 - 黑色将是黑色的。