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

时间:2010-12-16 17:01:42

标签: .net winforms transparency panel opacity

我想知道如何在C#中更改或修改Panel的透明度,而不是整个表单,但仅限于面板..我在Opacity上看过很多C#教程,但是它用于Form。我正在寻找仅限Panel的可能性。谢谢!

10 个答案:

答案 0 :(得分:40)

对于仍然在寻找一个完全透明的面板的人,我在this blog by William Smash找到了一个很好的解决方案,而后者又从Tobias Hertkorn on his T# blog取得了它。我认为值得在这里作为答案发布。

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

答案 1 :(得分:34)

是的,不透明度只适用于顶级窗口。它使用视频适配器的硬件功能,不支持子窗口,如Panel。 Winforms中唯一的顶级Control派生类是Form。

一些'纯'Winform控件,那些自己绘画而不是让原生Windows控件完成工作的控件,但确实支持透明的BackColor。小组就是其中之一。它使用一个技巧,它要求Parent绘制自己以产生背景像素。这个技巧的一个副作用是重叠控件不起作用,你只看到父像素,而不是重叠的控件。

此示例表单显示了它的工作原理:

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

如果这还不够好,那么您需要考虑将表单堆叠在一起。 Like this

值得注意的是,在Windows 8中解除了这一限制。它不再使用视频适配器覆盖功能,DWM(又名Aero)无法再关闭。这使得子窗口的不透明度/透明度易于实现。依赖于这一点当然是未来的音乐。 Windows 7将成为下一个XP:)

答案 2 :(得分:12)

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

需要注意的是,添加到面板的任何控件都有不透明的背景。尽管如此,半透明面板对我来说非常有用,可以阻止我的部分WinForms应用程序,以便用户将焦点转移到应用程序的适当区域。

答案 3 :(得分:4)

在表单构造函数中动态创建Panel时,不要忘记将Panel置于Front。选项卡控件的透明面板覆盖示例。

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

//< ==否则其他控件在透明面板的顶部涂漆

答案 4 :(得分:3)

据我所知,Panel只能有透明色,你无法控制面板的不透明度。因此,您可以让面板的某些部分完全透明,但不要说50%。

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

答案 5 :(得分:3)

试试这个:

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

更改alpha(A)以获得所需的不透明度。

答案 6 :(得分:0)

我只想添加到William Smash解决方案,因为我无法访问他的博客,因此无法找到可能存在于我的简单问题中的答案。

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

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

此外,您还需要添加

Imports System.Windows.Forms 

到您要添加覆盖类的文件。

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

Imports System.Drawing.Printing.PrintEventArgs

答案 7 :(得分:0)

一些评论说它有效,有些人则说没有 它仅适用于您的form背景,而不适用于

背后的任何其他controls

答案 8 :(得分:0)

面板不透明:

public class GlassyPanel : Panel
{
    const int WS_EX_TRANSPARENT = 0x20;  

    int opacity = 50;

    public int Opacity
    {
        get
        {
            return opacity;
        }
        set
        {
            if (value < 0 || value > 100) throw new ArgumentException("Value must be between 0 and 100");
            opacity = value;
        }
    }

    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;

            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (var b = new SolidBrush(Color.FromArgb(opacity * 255 / 100, BackColor)))
        {
            e.Graphics.FillRectangle(b, ClientRectangle);
        }

        base.OnPaint(e);
    }
}

答案 9 :(得分:-2)

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

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