Hacer un Control que sea transparente

Problema

Una pregunta bastante común en los foros es tener dentro de un formulario un Panel o PictureBox, y que sea trasparente a la imagen de fondo establecida en el formulario.

Dentro de los colores de Fondo que podemos establecer dentro de uno de estos controles existe “Transparent”. Pero este color no es la solución, porque no va a coger el valor de la imagen, sino que va a coger el color de fondo del formulario.

Posible Solución, que no es la mejor.

Recogeremos la imagen de fondo, y capturaremos los pixeles para establecerlos al contenedor que queremos hacer transparente.

   1: void HacerTransparente(Bitmap original,Control control)

   2:         {

   3:             

   4:             Bitmap copiaPanel = new Bitmap(panel1.Width, panel1.Height);

   5:             for (int x = 0; x < panel1.Width; x++)

   6:             {

   7:                 for (int y = 0; y < panel1.Height; y++)

   8:                 {

   9:                     copiaPanel.SetPixel(x, y, original.GetPixel(x + panel1.Location.X, y + panel1.Location.Y));

  10:                 }

  11:             }

  12:             control.BackgroundImage = copiaPanel;

  13:         }

 

Espero que os resulte de utilidad.

 

Saludos!

4 comentarios sobre “Hacer un Control que sea transparente”

  1. Hola Javier!

    Hace tiempo que no programo en Windows Forms, pero estuve bastante tiempo programando y creo que de alguna cosa me acuerdo.

    Lo que comentas del soporte de transparencia de los controles es porque el compositor GDI tiene deshabilitado el soporte de transparencia de manera predeterminada, pero se puede habilitar de una manera sencilla, porque si tienes que copiar los pixeles a mano de una imagen el proceso te va a llevar mucho tiempo:

    public class TransparentPictureBox : PictureBox
    {
    public TransparentPictureBox()
    {
    SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
    UpdateStyles();
    }
    }

    Simplemente heredando de la clase PictureBox y luego estableciendo el estilo a ControlStyles.SupportsTransparentsBackColor ya lo tenemos, un PictureBox que soporta color de transparencia.

    Es el mismo caso si quieres que los controles se dibujen con double buffer para evitar el molesto glich de cuando se actualizan.

    Saludos. Luis.

  2. Hola @Luis,

    UOUO gran respuesta sinceramente no me habia planteado eso.

    Si no te importa, lo indicare en el foro 🙂

    PD: Muchas gracias por leer el post y aportar esa gran idea!

  3. Hola, la verdad me suela muy util, pero no entendi mucho, hasta ya me hice bolas, podrian por favor no fuera mucha molestia subir la demo para libre descarga, y asi entender mejor!

    gracias!

Responder a jtorrecilla Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *