我正在尝试创建一个从System.Windows.Forms.Panel派生的半透明控件。 [编辑:基本上我要实现的是]:

我浏览了许多网络文章以及SO问题,并提出了以下建议:

class SeeThroughPanel : Panel
{
    public SeeThroughPanel()
    {
    }

    protected override CreateParams CreateParams {
        get {
            var cp = base.CreateParams;
            cp.ExStyle |= 0x00000020;
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        //base.OnPaint(e);
        e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(50, 0, 0, 0)), this.ClientRectangle);
    }
}

结果如下(请注意,此代码也不会使其真正半透明。与上图不同,该按钮以全彩色显示):

但是,一旦我做一些导致重新绘制半透明面板范围内的任何其他控件的操作,它就会被覆盖(在这种情况下,我已经滚动了基础控件):

所以我的问题是,如何避免这种情况?必须有某种方式。毕竟,Web浏览器一直都在处理这种渲染。

最佳答案

我已经做了一些测试。

您正在将多个问题混为一谈,所以让我们将它们分开:

  • 没有使用Winforms用C#编写WebBrowser。因此,这不是为什么必须做到这一点的原因。
  • 您的按钮几乎可以肯定不在Form的Controls集合中。您需要将其编写为脚本或使用一些UI技巧(*)将其放置在另一个控件上而不将其添加到其中。
  • 滚动时,您会看到任何滚动控制报告作为其表面。

  • 这是两个屏幕截图:

    这是在启动后:

    ..这是在我向右滚动一点之后:

    我使用此代码来确保Z顺序正确:
    button1.Parent = this;
    panel1.BringToFront();
    button1.BringToFront();
    seeThroughPanel1.BringToFront();
    

    注意如何节省按钮的空间。这显示了如何使用旧表面。

    要解决此问题,您必须获得当前的Form surfacse(可能是Control.DrawToBitmap),然后使用其中的正确部分来绘制“半透明”面板。当然,在捕获表单的当前表面之前,必须先将其隐藏。

    在我所有可怕的想法中,这似乎是最糟糕的想法之一。

    *技巧是使用键盘将其移至容器上方,用而不是鼠标移至上;有了这个技巧,它就可以移动而无需更改其父容器。在将控件放置在TabControl的选项卡顶部时也很有用...但是我对此很懒,因此我对其进行了编码。

    关于c# - 创建半透明的面板/控件。有没有万无一失的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24592272/

    10-12 05:40
    查看更多