¿Cómo puedo configurar la opacidad o transparencia de un Panel en WinForms?

Resuelto Gian Santillan asked hace 13 años • 10 respuestas

Me preguntaba cómo cambiar o modificar la transparencia de un Panel en C#, no todo el formulario, sino solo el panel. He visto muchos tutoriales de C# sobre Opacidad, pero es para el Formulario. Estoy buscando cómo podría ser posible solo con el Panel. ¡Gracias!

Gian Santillan avatar Dec 17 '10 00:12 Gian Santillan
Aceptado

Para quien todavía esté buscando un panel totalmente transparente, encontré una buena solución en este blog de William Smash , quien a su vez la tomó de Tobias Hertkorn en su blog T# . Pensé que valía la pena publicarlo como respuesta aquí.

Código 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);
    }
}

Código 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
Abdusalam Ben Haj avatar Mar 20 '2013 12:03 Abdusalam Ben Haj

Sí, la opacidad sólo puede funcionar en ventanas de nivel superior. Utiliza una función de hardware del adaptador de vídeo que no admite ventanas secundarias, como Panel. La única clase derivada de Control de nivel superior en Winforms es Form.

Sin embargo, varios de los controles 'puros' de Winform, los que pintan ellos mismos en lugar de dejar que un control nativo de Windows haga el trabajo, admiten un BackColor transparente. Panel es uno de ellos. Utiliza un truco: le pide al padre que se dibuje a sí mismo para producir los píxeles de fondo. Un efecto secundario de este truco es que los controles superpuestos no funcionan, solo se ven los píxeles principales, no los controles superpuestos.

Este formulario de muestra lo muestra en funcionamiento:

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

Si eso no es suficiente, entonces debes considerar apilar formularios uno encima del otro. Como esto .

Quizás sea notable que esta restricción se elimine en Windows 8. Ya no utiliza la función de superposición del adaptador de video y DWM (también conocido como Aero) ya no se puede desactivar. Lo que hace que la opacidad/transparencia en ventanas secundarias sea fácil de implementar. Confiar en esto es, por supuesto, la música del futuro por un tiempo. Windows 7 será el próximo XP :)

Hans Passant avatar Dec 16 '2010 18:12 Hans Passant

Según la información encontrada en http://www.windows-tech.info/3/53ee08e46d9cb138.php , pude lograr un control de panel translúcido usando el siguiente código.

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            var 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);
}

La advertencia es que cualquier control que se agregue al panel tiene un fondo opaco. No obstante, el panel translúcido me resultó útil para bloquear partes de mi aplicación WinForms para que el enfoque de los usuarios se desplazara al área apropiada de la aplicación.

Brian Hasden avatar Jan 30 '2014 21:01 Brian Hasden