gpt4 book ai didi

c# - 如何创建一个在其他控件之上工作的透明控件?

转载 作者:IT王子 更新时间:2023-10-29 04:43:20 26 4
gpt4 key购买 nike

我有一个控件(派生自 System.Windows.Forms.Control)需要在某些区域是透明的。我已经通过使用 SetStyle() 实现了这个:

public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent.
}

现在,如果窗体和透明控件之间没有控件,则此方法有效。但是,如果透明控件下面恰好有另一个控件(这是这里的用例),则不起作用。中间控件没有画出来,但是下面的表格确实显示透了。我可以通过覆盖 CreateParams 并像这样设置 WS_EX_TRANSPARENT flasg 来获得我需要的效果:

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20; // WS_EX_TRANSPARENT
return cp;
}
}

这里的问题是它确实减慢了控件的绘制速度。该控件已经是双缓冲的,因此无事可做。性能损失如此之大,以至于无法接受。还有其他人遇到过这个问题吗?我能找到的所有资源都建议使用方法 #1,但同样,这在我的情况下不起作用。

编辑:我应该注意到我确实有一个解决方法。子(透明)控件可以简单地将自己绘制到父级的 Graphics 对象上,但它真的很丑陋,我根本不喜欢这个解决方案(尽管我可能只有它)。

EDIT2:因此,根据我获得的有关透明度在 .NET 中工作原理的建议,我在包含透明控件的用户控件中实现了 IContainer 接口(interface)。我创建了一个实现 ISite 的类,我将我的子控件添加到 UserControl 的 Components 集合中,Container 属性在调试器中正确排列,但我仍然没有得到透明效果。有人有什么想法吗?

最佳答案

这只是我编造的一个简单的东西..我发现的唯一问题是当交叉控件更新时它不会更新..

它的工作原理是将位于当前控件后面/与当前控件相交的控件绘制到位图,然后将该位图绘制到当前控件。

protected override void OnPaint(PaintEventArgs e)
{
if (Parent != null)
{
Bitmap behind = new Bitmap(Parent.Width, Parent.Height);
foreach (Control c in Parent.Controls)
if (c.Bounds.IntersectsWith(this.Bounds) & c != this)
c.DrawToBitmap(behind, c.Bounds);
e.Graphics.DrawImage(behind, -Left, -Top);
behind.Dispose();
}
}

关于c# - 如何创建一个在其他控件之上工作的透明控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/592538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com