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


Me preguntaba cómo cambiar o modificar la transparencia de un Panel en C#, no la forma completa, 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 con el Panel solamente. ¡Gracias!

Author: Cody Gray, 2010-12-16

9 answers

Sí, la opacidad solo puede funcionar en ventanas de nivel superior. Utiliza una característica de hardware del adaptador de video, que no admite ventanas secundarias, como Panel. La única clase derivada de Control de nivel superior en Winforms es Form.

Varios de los controles Winform 'puros', los que hacen su propia pintura en lugar de dejar que un control nativo de Windows haga el trabajo, sin embargo soportan un color de fondo transparente. Panel es uno de ellos. Usa un truco, le pide al Padre que se dibuje para producir el píxeles de fondo. Un efecto secundario de este truco es que los controles superpuestos no funcionan, solo se ven los píxeles primarios, no los controles superpuestos.

Este formulario muestra cómo funciona:

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 lo suficientemente bueno, entonces debe considerar apilar formularios uno encima del otro. Así.

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

 32
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-04 10:00:00

Para quien todavía está buscando un panel totalmente transparente, encontré una buena solución en este blog de William Smash que a su vez lo ha tomado de Tobias Hertkorn en su T# blog. Pensé que vale la pena publicarlo como una 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);
    }
}

VB.Net código:

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
 38
Author: Abdusalam Ben Haj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-20 12:27:19

Basado en la información que se encuentra 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
        {
            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);
    }
}

La advertencia es que cualquier control que se agregue al panel tiene un fondo opaco. Sin embargo, el panel translúcido me fue ú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.

 10
Author: Brian Hasden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-30 21:40:20

Por lo que sé, un panel solo puede tener un color transparente, no se puede controlar la opacidad del panel. Por lo tanto, puede tener algunas partes de un panel completamente transparente, pero no un 50% para decir algo.

Para usar transparencia debe definir la propiedad color transparente.

 3
Author: Ignacio Soler Garcia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-16 17:25:11

Prueba esto:

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

Cambie alpha(A) para obtener la opacidad deseada.

 3
Author: Dark Knight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-19 01:48:03

No olvide llevar su Panel al frente cuando lo cree dinámicamente en el constructor de formularios. Ejemplo de superposición de panel transparente de control de tabulación.

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

//

 2
Author: Bill Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-19 18:52:06

Solo quería agregar a la solución de William Smash ya que no pude llegar a su blog, por lo que las respuestas que pueden haber estado allí a mis simples preguntas no se pudieron encontrar.

Me llevó un tiempo darme cuenta, pero tal vez solo estaba teniendo un momento...

Si no ha tenido que hacerlo ya tendrá que añadir una referencia al Sistema.Windows.Formularios en las propiedades del proyecto.

También tendrás que añadir

Imports System.Windows.Forms 

Al archivo donde está agregando la anulación clase.

Para OnPaintBackground necesitará agregar una referencia para System.Dibujo entonces

Imports System.Drawing.Printing.PrintEventArgs
 0
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-10 13:53:31

Algunos comentarios dicen que funciona y otros dicen que no Funciona solo para su form fondo no cualquier otro controls detrás de

 0
Author: Ahmed Taha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 07:23:47

Esto funciona para mí. En el siguiente ejemplo, el rango alfa puede ser un valor entre 0 y 255. Anteriormente, cometí un error al pensar que debe ser un valor de porcentaje.

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

 -1
Author: umami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-06 06:31:02