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

Gia*_*lan 44 .net transparency panel opacity winforms

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

Abd*_*Haj 41

对于那些仍在寻找一个完全透明的面板的人,我在这个博客中找到了一个很好的解决方案,William Smash反过来从Tobias Hertkorn的T#博客上获取了它.我认为值得在这里作为答案发布.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 我已将此面板应用于表单,并且在PaintBackground上我以不透明颜色绘制cliprect,但在表单下面我有其他控件,这似乎过度绘制了这个新面板,即使该面板放置在表单控件和我的其他自定义控件上被放在另一个面板上。我是否需要在自定义控件中执行任何特定操作以允许在顶部进行绘制? (2认同)

Han*_*ant 35

是的,不透明度只适用于顶级窗口.它使用视频适配器的硬件功能,不支持子窗口,如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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这还不够好,那么您需要考虑将表单堆叠在一起. 像这样.

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


Bri*_*den 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,我得到了它的工作.但它只有在我对面板完全没有控制权时才有效.并且面板后面的所有控件仍然显示非常正常,因此它实际上只是在面板下调整背景.这基本上没用作"叠加". (3认同)

Dar*_*ght 6

尝试这个:

panel1.BackColor = Color.FromArgb(100, 88, 44, 55);
Run Code Online (Sandbox Code Playgroud)

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

  • 我似乎无法让它发挥作用。更改 alpha 层会使面板的颜色变暗或变亮,但我看不到它后面的控件。我错过了什么吗? (31认同)
  • 这**不起作用**。请参阅[此](http://stackoverflow.com/a/21467954/1461424)答案。 (15认同)

Meh*_*ani 5

不透明面板:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)