sábado, 20 de febrero de 2010

UserControls transparentes en WinForms

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…

image

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…

image

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.

image

Esta vez el código en VB porque hay menos ejemplos de VB de esto en la web.

Saludos!

9 comentarios:

martesytrece dijo...

Me encanta la programación, pero no al nivel tuyo: suelo hacer programas en CLIPPER.

Enhorabuena por tu trabajo.

Saludos cordiales.

Rulas dijo...

Nunca he programado en clipper hermano pero en una de esas le aprendo.

Saludos

Anónimo dijo...

¡Hola buenas!

Acabo de ver tu blog y para mi es interesante y tengo que felicitarte, te animo.

Mi blog es: http://sordobierzo.blogspot.com/

Muchas gracias.

Un saludo

Rulas dijo...

Gracias Josi... ahi nos pasamos por tu blog, saludos

Unknown dijo...

Rulas
esta chevere tu blog... segui posteando.

ahi te dejo para que lo cheques:

www.tumentepoderosa.blogspot.com

fer

Unknown dijo...

muy buen BLOG!

Solo que no uso clipper por ahora apenas ando en python y asi :S

gracias por tus aportes!

Anónimo dijo...

Como novato, siempre estoy buscando en línea para los artículos que me puede ayudar. Gracias Wow! ¡Gracias! Siempre quise escribir en mi sitio algo así. ¿Puedo tomar parte de tu post en mi blog?

Anónimo dijo...

He intención de publicar algo como esto en mi página web y me dio una idea. Saludos.

Anónimo dijo...

Mate. Este blog es increíble. ¿Cómo puedo hacer que se vea así de bien?