如何在WinForms中设置面板的不透明度或透明度?

我想知道如何改变或修改在C#面板的透明度,而不是整个窗体,但只有面板..我已经看到许多不透明度的C#教程,但它的forms。 即时通讯只寻求如何可能与专家小组。 谢谢!

是的,不透明只能在顶层窗口中使用。 它使用video适配器的硬件function,不支持子窗口,如面板。 Winforms中唯一的顶级Control派生类是Form。

几个“纯粹”的Winform控件,那些自己绘画而不是让本地Windows控件执行这个工作的控件,不过支持透明的BackColor。 小组就是其中之一。 它使用一个技巧,它要求父绘制自己产生背景像素。 这个技巧的一个副作用是重叠控件不起作用,你只能看到父像素,而不是重叠控件。

这个样本表格显示了它在工作:

public partial class Form1 : Form { public Form1() { InitializeComponent(); this.BackColor = Color.White; panel1.BackColor = Color.FromArgb(25, Color.Black); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100); } } 

如果这还不够好,那么你需要考虑堆叠forms。 像这样

值得注意的可能是这个限制在Windows 8中解除了。它不再使用video适配器覆盖function,DWM(又名Aero)不能再被closures了。 这使得儿童窗口上的不透明/透明度易于实现。 依靠这个当然是未来音乐的一段时间。 Windows 7将成为下一个XP 🙂

对于那些仍然在寻找一个完全透明的面板的人来说,我在这个博客中find了一个很好的解决scheme, William Smash反过来是在他的T#博客上从Tobias Hertkorn那里拿来的 。 我认为它值得在这里发表一个答案。

C#代码:

 public class TransparentPanel : Panel { protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return cp; } } protected override void OnPaintBackground(PaintEventArgs e) { //base.OnPaintBackground(e); } } 

VB.Net代码:

 Public Class TransparentPanel Inherits Panel Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or &H20 ''#WS_EX_TRANSPARENT Return cp End Get End Property Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs) ''#MyBase.OnPaintBackground(e) End Sub End Class 

基于http://www.windows-tech.info/3/53ee08e46d9cb138.php上的信息,我能够使用以下代码实现半透明的面板控制。;

 public class TransparentPanel : Panel { protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return cp; } } protected override void OnPaint(PaintEventArgs e) { e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle); } } 

需要注意的是,添加到面板的任何控件都有不透明的背景。 尽pipe如此,半透明面板对我来说是有用的,可以阻挡我的WinForms应用程序的一部分,使用户的注意力转移到应用程序的适当区域。

尝试这个:

 panel1.BackColor = Color.FromArgb(100, 88, 44, 55); 

改变alpha(A)来获得所需的不透明度。

据我所知一个面板只能有一个透明的颜色,你不能控制面板的不透明度。 所以,你可以使面板的某些部分完全透明,但不能说50%的东西。

要使用透明度,您必须定义透明颜色属性。

在窗体构造函数中dynamic创build面板时,不要忘记将面板置于前面。 选项卡控件的透明面板覆盖示例。

 panel1 = new TransparentPanel(); panel1.BackColor = System.Drawing.Color.Transparent; panel1.Location = new System.Drawing.Point(0, 0); panel1.Name = "panel1"; panel1.Size = new System.Drawing.Size(717, 92); panel1.TabIndex = 0; tab2.Controls.Add(panel1); panel1.BringToFront(); 

// <==否则其他控件将绘制在透明面板的顶部

我只是想添加到威廉斯马什解决scheme,因为我无法访问他的博客,所以可能已经在那里对我的简单问题的答案找不到。

花了一段时间才意识到,但也许我只是有一个时刻…

如果您还没有这样做,那么您需要在项目属性中添加对System.Windows.Forms的引用。

你也需要添加

 Imports System.Windows.Forms 

到要添加覆盖类的文件。

对于OnPaintBackground,您需要为System.Drawing添加一个引用

 Imports System.Drawing.Printing.PrintEventArgs 

这对我有用。 在下面的例子中,Alpha范围可以是0到255之间的一个值。以前,我认为它必须是一个百分比值,这是错误的。

Dim x as integer = 230 Panel1.BackColor = Color.FromArgb(x, Color.Blue)