在Visual Studio窗体窗体中使用面板上的不透明度的任何技巧?
我最近开始探索Visual Studio。 我试图创建一个幻灯片菜单。 更具体地说,当用户按下按钮时,子菜单会弹出到右侧。 为了达到这个目的,我已经放置了一个Panel
来调整自身的大小 除了function,我想添加更多的设计,使Panel
显得有点褪色。
我知道Visual Studio中的Panels
没有不透明性,但我在想是否有人知道如何实现它的方法技巧。 我尝试了一个Picture Box
但是它也没有Opacity作为属性。 我避免使用visual studio提供的常规Menu
对象,因为我想添加更多设计。 有任何想法吗?
- 创建一个inheritance自
Panel
的类。 - 在构造函数中为控件设置样式
ControlStyle.Opaque
。
如果为true,则控件被绘制为不透明且背景未绘制。
- 覆盖
CreateParams
并WS_EX_TRANSPARENT
设置WS_EX_TRANSPARENT
样式。
指定使用此样式创建的窗口是透明的。 也就是说,窗口下方的任何窗口都不会被窗口遮挡。 使用此样式创建的窗口仅在更新了其下的所有同级窗口后才会收到WM_PAINT消息。
- 创建一个
Opacity
属性,该属性接受0到100之间的值,这些值将用作背景的Alpha通道。 - 覆盖
OnPaint
并使用从BackGroundColor
和Opacity
创建的支持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
不会绘制窗体的控件 ,这些控件与面板重叠,但只绘制窗体的背景。