Controles transparentes en VB .NET

Controles de botón (Button) o de etiqueta (Label) en formularios de VB .NET que tengan transparencia como color de fondo pero no para pintar el color del control primario que es el formulario sino la del control inmediatamente superior (PictureBox…)

Controles transparentes

En algunas ocasiones puede ser conveniente que las botones aplicados sobre la imagen de un PictureBox (o cualquier otro control) tengan su fondo transparente. Para que Button sea transparente hay que establecer su propiedad BackColor en Color.Transparent.
La propiedad BackColor es una propiedad de ambiente. Una propiedad de ambiente es una propiedad del control que, si no se establece, se recupera del control principal. Por ejemplo, de forma predeterminada el control Button tendrá la misma propiedad BackColor que su control Form principal.

Si hay otro control entre el control actual (Button) y el primario correspondiente (Form), Button no mostrará el color del control situado en medio sino el del control primario (Form). Por ejemplo, los botones transparentes situados sobre un PictureBox cogen el color de fondo del formulario y no el del PictureBox (que es el control intermedio).

Podríamos hacer que el botón se configurase con el color de fondo de la imagen que tiene debajo en el PictureBox añadiéndolo al grupo de controles de PictureBox con el método Controls.Add, de esta manera PictureBox se convierte en el control primario de Button (en lugar de Form) y es con él con el que simula la transparencia.

Me.PictureBox1.Controls.Add(Me.Button1)

Enumeración ControlStyles

La propiedad BackColor no admite colores transparentes a menos que el estilo ControlStyles.SupportsTransparentBackColor (de la enumeración ControlStyles) se establezca en True. La enumeración ControlStyles especifica el estilo y el comportamiento de un control. Los controles utilizan esta enumeración en diferentes propiedades y métodos que varían su funcionalidad. Un control puede habilitar un estilo llamando al método SetStyle y pasando el estilo o estilos ControlStyles correspondientes y el valor de tipo booleano en el que va a establecerse el estilo.

Por ejemplo, la siguiente línea de código habilitaría el color transparente en el control miControl:

miControl.SetStyle (UserPaint Or AllPaintingInWmPaint, True)

La siguiente línea de código habilitaría el color de fondo transparente para un control Form:

Me.SetStyle(ControlStyles.ResizeRedraw Or _
ControlStyles.SupportsTransparentBackColor Or _
ControlStyles.UserPaint Or _
ControlStyles.AllPaintingInWmPaint, True)

En un ejemplo real, si el bit SupportsTransparentBackColor del formulario se establece en True y la propiedad BackColor de Label se establece en color transparente, OnPaintBackground simulará la transparencia pidiendo al control primario (Form) que pinte el fondo de Button. Ésta no es una transparencia real, la transparencia se simulará sólo si se establece el bit UserPaint en True y si el control primario deriva de Control. Si UserPaint (otro miembro de ControlStyles) es True es el propio control en lugar del sistema operativo el que se pinta a sí mismo. Este estilo sólo se aplica a las clases derivadas de Control.

Botón transparente con el color de la imagen

En el ejercicio de referencia se aplica a los botones colocados sobre la imagen que, al ser pulsados, cierran la ventana. En los recortes de tipo romboidal y poligonal la imagen está directamente como fondo del formulario que de esta forma es el control padre del botón y, sin necesidad de código adicional, obtiene por transparencia el color de la imagen que tiene debajo.

En el recorte de tipo circular se ha interpuesto un PictureBox que es el que se rellena con la imagen. Si en las propiedades del botón colocamos el código siguiente sin más, el resultado es que el botón no se ve porque coge el color del Formulario y no el de la imagen.

Me.BtCerrar.BackColor = System.Drawing.Color.Transparent
Me.BtCerrar.UseVisualStyleBackColor = False

Hay que añadir el botón al grupo de controles del PictureBox y de esta forma el botón coge el color de la imagen y se muestra.

Private Sub FormCircular_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.PBox1.Controls.Add(Me.BtCerrar)
End Sub