我有一个控件(派生自System.Windows.Forms.Control),需要在某些区域上是透明的。我通过使用SetStyle()来实现:
public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent.
}
如果在透明控件和表单之间没有其他控件,那么这个方法是有效的。然而,如果在透明控件下方有另一个控件(就像这里的情况一样),它将不起作用。中间的控件不会被绘制,但是下面的表单会透过来显示。您可以通过覆盖CreateParams并设置WS_EX_TRANSPARENT标志来获得所需的效果,代码如下:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20; // WS_EX_TRANSPARENT
return cp;
}
}
这里的问题在于它会使得控件的绘制速度变得非常缓慢。该控件已经具有双缓冲功能,因此在这方面无事可做。效能的损失非常严重,是无法接受的。是否还有其他人遇到过这个问题?我能找到的所有资源都建议使用方法#1,但在我的情况下,它仍然不起作用。编辑:我应该指出,我确实有一个解决方法。子(透明)控件可以简单地将自己绘制到父级的Graphics对象上,但这样做真的很丑陋,我不喜欢这种解决方案(尽管这可能是我唯一拥有的解决方案)。
编辑2:因此,根据我从.NET中获取的关于透明度如何工作的建议,在包含透明控件的用户控件中实现了IContainer接口。我创建了一个实现ISite的类,将我的子控件添加到UserControl的Components集合中,容器属性在调试器中正确对齐,但我仍然没有获得透明效果。有人有什么想法吗?