在 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 提供的常规Menu
object,因为我想添加更多设计。有什么想法吗?
【问题讨论】:
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
填充背景,该 BackGroundColor
和 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);
截图
【讨论】:
不错的解决方案。我用计时器实现了它,因此不透明度将从 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代码中检测文档中语言的变化?