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

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

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

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

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

  1. 覆盖CreateParamsWS_EX_TRANSPARENT设置WS_EX_TRANSPARENT样式。

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

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

完整的代码

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

截图

在此处输入图像描述

要使控件“透明”,您应该将其父级的右侧区域绘制到控件上。 这就是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不会绘制窗体的控件 ,这些控件与面板重叠,但只绘制窗体的背景。