【发布时间】:2010-10-26 18:51:45
【问题描述】:
我正在制作一个 .NET 3.5 应用程序,其表单绘制了部分透明的黑色背景。我正在重写 OnPaintBackground 来完成此操作:
protected override void OnPaintBackground( PaintEventArgs e )
{
using ( Brush brush = new SolidBrush( Color.FromArgb( 155, Color.Black ) ) )
{
e.Graphics.FillRectangle( brush, e.ClipRectangle );
}
}
它可以工作,但有时表单会在不清除屏幕的情况下自行绘制,从而使透明度比应有的更暗。我尝试过使用Graphics.Flush() 和Graphics.Clear(),但它要么无济于事,要么完全消除了透明度。有什么建议吗?
编辑: 下面是它的样子,在左侧启动应用程序之后,在右侧表单重绘自身几次(以响应从一个控件到另一个控件的切换)之后:
Transparency Issue http://www.quicksnapper.com/files/5085/17725729384A10347269148_m.png
编辑 2: 今天早上我尝试了一些事情,并注意到当透明部分后面的桌面发生变化时,它实际上并没有被重绘。例如,如果我打开任务管理器并将其放在窗口后面,您不会看到它自行刷新。这与我在透明度级别上看到的情况是有道理的。是否有让 Windows 重绘窗口后面区域的功能?
编辑 3: 我尝试更改表单上的一些属性,但它们都导致表单绘制不透明的黑色:
this.AllowTransparency = true;
this.DoubleBuffered = true;
this.Opacity = .99;
我将尝试为透明部分创建一个单独的窗口,正如提到的过度松弛,但仍然欢迎任何其他想法。
【问题讨论】:
-
这是您无法设置 Opacity 属性的情况吗?
-
是的,我不希望表单的控件是透明的,只是窗口背景的一部分。
-
这是在启用 Aero 的 Vista 上吗?知道这一点会很有用,这样我就可以自己尝试解决这个问题。
-
目前只是Windows XP,我还没有开始在Vista上测试。
-
Marc,任务管理器“不刷新自身”的问题实际上是您的应用程序没有重新绘制。尽管您是半透明地绘制的,但实际的窗口仍然是 100% 不透明的。这就是 Demi 建议使用 Opacity 属性的原因。我将在下面更新我的答案,为您提供另一个想法。
标签: c# .net winforms drawing transparency