Lio*_*hon 8 .net c# panel opacity winforms
我最近开始探索Visual Studio.我试图创建一个幻灯片菜单.更具体地说,当用户按下按钮时,子菜单会弹出到右侧.为了实现这一点,我已经放置了一个Panel调整自己的大小.除了功能,我想添加更多的设计,使Panel显示有点褪色.
我知道Panels在Visual Studio中没有不透明度,但我在想是否有人知道如何实现它的方法技巧.我尝试过Picture Box但是也没有Opacity作为属性.我避免使用Menuvisual studio提供的常规对象,因为我想添加更多设计.有任何想法吗?
Rez*_*aei 20
Panel.ControlStyle.Opaque在构造函数中设置控件的样式.如果为true,则控件将绘制为不透明且背景未绘制.
SetStyle并设置CreateParams样式.指定使用此样式创建的窗口是透明的.也就是说,窗口下方的任何窗口都不会被窗口遮挡.使用此样式创建的窗口仅在更新了其下的所有兄弟窗口后才会收到WM_PAINT消息.
WS_EX_TRANSPARENT接受0到100之间值的属性,该属性将用作背景的Alpha通道.Opacity使用OnPaint从Brush和创建的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)
截图
要使控件“透明”,您应该将其父级的右侧区域绘制到该控件上。这就是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不会绘制与面板重叠的表单控件,而仅绘制表单的背景。