在 Visual Studio 窗口窗体中的面板上使用不透明度有什么技巧吗?

2024-02-15

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

我知道Panels在 Visual Studio 中没有不透明度,但我在想是否有人知道如何实现它的方法。我尝试了一个Picture Box但它也没有不透明度作为属性。我避免使用常规的Menu反对视觉工作室提供的功能,因为我想添加更多设计。有任何想法吗?


  1. 创建一个继承自的类Panel https://learn.microsoft.com/en-us/dotnet/framework/winforms/controls/panel-control-windows-forms?WT.mc_id=DT-MVP-5003235.
  2. Set the 对于构造函数中的控制使用.

如果为 true,则控件将绘制为不透明,并且背景不是 绘。

  1. 覆盖并设置WS_EX_TRANSPARENT https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles?WT.mc_id=DT-MVP-5003235它的风格。

指定使用此样式创建的窗口是透明的。 也就是说,窗口下方的任何窗口都不会被 窗户。使用此样式创建的窗口接收 WM_PAINT 仅当其下方的所有同级窗口均已更新后才会显示消息。

  1. 创建一个Opacity属性接受 0 到 100 之间的值,这些值将用作背景的 Alpha 通道。
  2. 覆盖并使用启用 Alpha 填充背景Brush是从创建的BackGroundColor and Opacity.

完整代码

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);
    }
}

截屏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Visual Studio 窗口窗体中的面板上使用不透明度有什么技巧吗? 的相关文章

随机推荐