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

标签 c# winforms transparent-control

我有一个控件(派生自 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/

相关文章:

WPF:忽略鼠标点击覆盖/装饰器,但处理 MouseEnter 事件

delphi - 在桌面上书写文字

c# - 如何生成唯一的付款号码?

c# - 编写 XML 文档时如何在方法摘要中引用方法参数?

c# - 是否有正则表达式来测试字符串是否适用于语言环境?

c# - 为什么在 DDD 中实现 IEquatable 的值对象?

winforms - 在 winforms 中引导依赖项(使用 StructureMap)

.net - 如何从应用程序内启动 ClickOnce 应用程序的卸载?

c# - 单击按钮时如何检查已经打开的窗口?

delphi - 如何使表单透明,同时保持组件可见?