在Visual Studio窗体窗体中在面板上使用不透明度的任何技巧?

Lio*_*hon 8 .net c# panel opacity winforms

我最近开始探索Visual Studio.我试图创建一个幻灯片菜单.更具体地说,当用户按下按钮时,子菜单会弹出到右侧.为了实现这一点,我已经放置了一个Panel调整自己的大小.除了功能,我想添加更多的设计,使Panel显示有点褪色.

我知道Panels在Visual Studio中没有不透明度,但我在想是否有人知道如何实现它的方法技巧.我尝试过Picture Box但是也没有Opacity作为属性.我避免使用Menuvisual studio提供的常规对象,因为我想添加更多设计.有任何想法吗?

Rez*_*aei 20

  1. 创建一个继承自的类Panel.
  2. ControlStyle.Opaque在构造函数中设置控件的样式.

如果为true,则控件将绘制为不透明且背景未绘制.

  1. 覆盖SetStyle并设置CreateParams样式.

指定使用此样式创建的窗口是透明的.也就是说,窗口下方的任何窗口都不会被窗口遮挡.使用此样式创建的窗口仅在更新了其下的所有兄弟窗口后才会收到WM_PAINT消息.

  1. 创建一个WS_EX_TRANSPARENT接受0到100之间值的属性,该属性将用作背景的Alpha通道.
  2. Opacity使用OnPaintBrush和创建的alpha启用覆盖并填充背景BackGroundColor.

完整代码

public class ExtendedPanel : Panel
{
    private const int WS_EX_TRANSPARENT = 0x20;
    public ExtendedPanel()
    {
        SetStyle(ControlStyles.Opaque, true);
    }

    private int opacity = 50;
    [DefaultValue(50)]
    public int Opacity
    {
        get
        {
            return this.opacity;
        }
        set
        {
            if (value < 0 || value > 100)
                throw new ArgumentException("value must be between 0 and 100");
            this.opacity = value;
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
        {
            e.Graphics.FillRectangle(brush, this.ClientRectangle);
        }
        base.OnPaint(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

截图

在此输入图像描述

  • 不幸的是,这似乎不适用于“SplitPanel”。 (2认同)

Gyö*_*zeg 3

要使控件“透明”,您应该将其父级的右侧区域绘制到该控件上。这就是Button在绘制内容之前所做的事情,因此圆角将是透明的。

要模仿半透明,您可以将表单绘制到面板上,然后使用 Alpha 绘制一些内容:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    PaintTransparentBackground(panel1, e);
    using (Brush b = new SolidBrush(Color.FromArgb(128, panel1.BackColor)))
    {
        e.Graphics.FillRectangle(b, e.ClipRectangle);
    }
}

private static void PaintTransparentBackground(Control c, PaintEventArgs e)
{
    if (c.Parent == null || !Application.RenderWithVisualStyles)
        return;

    ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c);
}
Run Code Online (Sandbox Code Playgroud)

半透明面板

请注意,ButtonRenderer.DrawParentBackground不会绘制与面板重叠的表单控件,而仅绘制表单的背景。