在 Visual Studio Window Form 的面板上使用不透明度的任何技巧?

Posted

技术标签:

【中文标题】在 Visual Studio Window Form 的面板上使用不透明度的任何技巧?【英文标题】:Any trick to use opacity on a panel in Visual Studio Window Form? 【发布时间】:2015-11-30 17:54:00 【问题描述】:

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

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

【问题讨论】:

How can I set the opacity or transparency of a Panel in WinForms?的可能重复 我看过这个,但这对我不起作用,这就是我问的原因。谢谢 我不认为它是重复的。发帖人知道控件没有不透明性。 面板下面应该是什么或您将使用的任何控件?什么会发光?其他控件?动态内容? 【参考方案1】:
    创建一个继承自 Panel 的类。 使用SetStyle在构造函数中设置ControlStyle.Opaque进行控制。

如果为true,则控件绘制为不透明且背景不为 画了。

    覆盖CreateParams 并为其设置WS_EX_TRANSPARENT 样式。

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

    创建一个Opacity 属性,该属性接受从 0 到 100 的值,用作背景的 Alpha 通道。 覆盖 OnPaint 并使用启用 alpha 的 Brush 填充背景,该 BackGroundColorOpacity 创建。

完整代码

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

截图

【讨论】:

不错的解决方案。我用计时器实现了它,因此不透明度将从 100 开始并下降到 0。但是它像疯了一样闪烁。知道如何获得流畅的动画吗? @ChrisB 我会用计时器检查它,但也许你会发现 this post 有用。 不幸的是,这似乎不适用于SplitPanel 一般工作,但是当我将光标放在“表单上的按钮”的未覆盖部分上时,按钮被带到前台并停留在那里。我该如何解决?当鼠标离开它时,它应该会自动返回到后台。 我在运行应用程序时无法让它工作,它显示在设计视图中,但在我运行应用程序时不显示?【参考方案2】:

要使控件“透明”,您应该将其父控件的正确区域绘制到控件上。这就是 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);

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

【讨论】:

如果有要重叠的控件,您仍然可以使用 drawtobitmap 在位图中获取目标。不过,动画在 winforms 中看起来很糟糕..【参考方案3】:

在面板上设置任何颜色。比如黑色,之后只需要注册 TransparencyKey 形状,然后选择要透明的颜色即可:

 public Form1()
        
            InitializeComponent();
            panel1.BackColor = Color.Black; 
            this.TransparencyKey = Color.Black;
        

【讨论】:

以上是关于在 Visual Studio Window Form 的面板上使用不透明度的任何技巧?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio Command Window 2010 命令可以在脚本中执行吗

在 Visual Studio Window Form 的面板上使用不透明度的任何技巧?

在 Window 10 的 Visual Studio 中为 64 位编译时,Wow64DisableWow64FsRedirection() 函数不起作用

如何在Visual Studio代码中检测文档中语言的变化?

如何在 Visual Studio 代码中配置设置,以便更漂亮地为 react.js 工作

Visual Studio版本与ToolsVersion与工具集版本号对应版本号