Aunque esto es pan comido en WPF, en WinForms las transparencias son algo confusas y no hay builtins correctamente diseñados para trabajar con ellas.
Si agregamos un Label sobre una PictureBox y ponemos la propiedad BackColor del Label como transparente… simplemente nada sucede…
Una solución a esto es crear nuestro propio control TransparentLabel que herede de Label el código sería algo así.
Public Class TransparentLabel
Inherits Control
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
'Creamos una instancia de create params
'a partir de la base y cambiamos su propiedad
'ExStyle a nulo
Dim params As CreateParams = MyBase.CreateParams
params.ExStyle = &H20
Return params
End Get
End Property
Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaintBackground(pevent)
'Con esto anulamos el evento de Paint Background
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
'Creamos una brocha del color de la fuente original y dibujamos sólo
'el texto...
Dim newBrush As SolidBrush = New SolidBrush(ForeColor)
e.Graphics.DrawString(Text, Font, newBrush, -1, 0)
End Sub
End Class
Y listo, ya tenemos nuestro propio label transparente.
Pero que pasa cuando tenemos un UserContol sobre la imagen, aunque usemos nuestro TransparentLabel en él, no funcionara ni aún poniendo el fondo del UC como Transparent…
Así que hay que modificar el user control así.
Public Class UserControl1
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim params As CreateParams = MyBase.CreateParams
params.ExStyle = &H20
Return params
End Get
End Property
Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaintBackground(e)
End Sub
End Class
Y finalmente tenemos ambas cosas, un TransparentLabel y un User Control Transparente también.
Esta vez el código en VB porque hay menos ejemplos de VB de esto en la web.
Saludos!