我有一个控件(派生自 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,但同样,这在我的情况下不起作用。
编辑:我应该注意我确实有一个解决方法。子(透明)控件可以简单地将自己绘制到父图形对象上,但它真的很丑陋,我根本不喜欢这个解决方案(尽管它可能是我所拥有的全部)。
EDIT2:因此,根据我得到的关于透明度如何在 .NET 中工作的建议,我在包含透明控件的用户控件中实现了 IContainer 接口。我创建了一个实现 ISite 的类,我将我的子控件添加到 UserControl 的 Components 集合中,Container 属性在调试器中正确排列,但我仍然没有得到透明效果。有没有人有任何想法?