为.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上运行 - 我需要它们才能优雅地降级。这里有最好的做法吗?
答案 0 :(得分:3)
实际上没有更简单的方法可以做到这一点。 .NET Framework尚未公开这些API,因此唯一的方法是通过某种互操作(或WPF)。
至于使用两个Windows版本,你的代码应该没问题,因为在你实际调用函数之前,运行时不会查找DLL的入口点。
答案 1 :(得分:1)
我最后做了一件令人讨厌的事情。用GDI +创建了我自己的UI。 (按钮,圆形标签等)。无论Windows版本如何,它看起来都一样。 Win.Forms真的很难看,但这就是你所拥有的XP<侧。
答案 2 :(得分:1)
我想你忘了设置你想成为玻璃的区域的TransparencyKey。从文章
在Windows窗体应用程序中,您 只需要设置TransparencyKey 属性为您不会使用的颜色 在应用程序的其他地方(我使用 Gainsboro,原因就是这样 后来变得明显)。然后你可以 创建一个或多个面板 停靠在你的表格边缘 设置面板的背景颜色 到透明度键。现在当你 调用DwmExtendFrameIntoClientArea ,. 玻璃将显示在其边缘内 无论你在哪里设置的东西 适当的透明度。
答案 3 :(得分:0)
我不介意非托管调用 - 这是使用黑盒模仿alpha行为的黑客行为,以及它对顶部某些组件中的黑色元素的影响就是问题。
答案 4 :(得分:0)
你可以使用的廉价黑客是在你的表单上放置一个透明的Panel控件并将控件放在它上面 - 然后黑色会变成黑色。