none
Label con forma personalizada RRS feed

  • Pregunta

  • Me preguntaba si es posible hacer un label de forma personalizada, es decir, que no tenga que ser rectangular. Más claro, mi intención es hacer que se active al pasar por un dibujo de España pero solo por la forma de la provincia de Madrid. Si esto no es posible con Visual Studio, ¿sabrían con que otro programa podría conseguirlo? Trato de hacer una animación educativa para el reconocimiento de las provincias españolas.

    sábado, 5 de septiembre de 2015 10:15

Respuestas

  • Una cosa que puedes hacer: Si añadiste la clase simplemente con "añadir clase", haz la prueba de añadirla en su lugar al explorador de soluciones con la opción de "añadir control de usuario". Cuando lo añada, editas el código para que herede de "Control" en lugar de "UserControl", y luego en el interior de la clase pegas el OnPaint y la propiedad Text. A ver si así sí que te lo reconoce Visual Studio. Ojo, cuando añades el UserControl te mete todo el código en el archivo oculto .designer.vb mediante un partial class; el .vb te lo deja en blanco. Yo lo que hice es vaciar el .designer.vb y pegar la clase en el .vb.
    domingo, 6 de septiembre de 2015 11:55

Todas las respuestas

  • La forma de hacerlo depende de la tecnología que estés usando para tu aplicación.

    Por ejemplo, si es cualquiera de las que usan XAML (WPF, Silverlight, AppStore), entonces simplemente puedes reemplazar el Template del label. En el nuevo template puedes usar cualquier elemento que te venga bien para dibujar la forma, por ejemplo puede ser un <Path> o puedes pintar el fondo con una brocha de imagen en la que hayas cargado el gráfico correspondiente.

    Si es WinForms, entonces quizá lo mejor sea usar GDI+ en un control personalizado. Hereda una clase de Control, y en el evento Paint dibuja la forma deseada, y usa también e.DrawText para escribir el texto del label (que expondrás mediante una prpiedad pública).

    sábado, 5 de septiembre de 2015 12:07
  • Alberto, primero, gracias por contestar. Pero en segundo lugar, me lo pones un poco difícil porque a pesar de tu ayuda no llego  a tanto. Efectivamente, uso WinForms con VB 2010 pero eso de usar GDI+ en un control personalizado y el resto de lo que me dices no lo entiendo. Si pudieras ayudarme con algún ejemplo o Tutorial te lo agradecería.
    sábado, 5 de septiembre de 2015 12:28
  • Adjunto un ejemplo. Simplemente añade a tu proyecto una clase con este contenido:

    Public Class LabelEspecial
        Inherits System.Windows.Forms.Control
    
        Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
            Dim Ancho As Integer = Me.Width
            Dim Alto As Integer = Me.Height
            e.Graphics.DrawLine(Pens.Black, Ancho \ 2, 0, Ancho, Alto)
            e.Graphics.DrawLine(Pens.Black, 0, Alto - 1, Ancho, Alto - 1)
            e.Graphics.DrawLine(Pens.Black, 0, Alto - 1, Ancho \ 2, 0)
            e.Graphics.DrawString(Me.Text, Me.Font, Brushes.Black, 20, Alto \ 2)
        End Sub
    
        Public Overrides Property Text As String
            Get
                Return MyBase.Text
            End Get
            Set(value As String)
                MyBase.Text = value
                Me.Invalidate()
            End Set
        End Property
    End Class
    

    Después de añadirlo y compilar el proyecto, en el diseñador de formularios te saldrá "LabelEspecial" al principio de la barra de herramientas. Puedes arrastrarlo y soltarlo con normalidad al formulario como cualquier label, y ponerle un valor en el Text. Saldrá con forma de triángulo, debido a los tres "DrawLine" que yo le he puesto, pero evidentemente cambiando las instrucciones puedes ponerle la forma que quieras. Para hacer una forma compleja, puedes usar una única instrucción "DrawLines" (en plural) que recibe como argumento un array de puntos.
    sábado, 5 de septiembre de 2015 17:27
  • Alberto, nuevamente gracias por tu interés. Ahora lo entiendo mucho mejor. Solo tengo un problema: que tras hacer lo que me dices y compilar el proyecto no me aparece o no localizo el "Diseñador de formularios" que me dices (donde encontraría LabelEspecial). No lo encuentro ni en el Cuadro de Herramientas ni en el Menú superior. ¿Qué fallo puedo estar cometiendo? Perdón y gracias.
    sábado, 5 de septiembre de 2015 21:00
  • no localizo el "Diseñador de formularios"

    Me refiero a que simplemente abras el Form1.vb en modo de diseño en Visual Studio. La pestaña que abre Visual Studio mostrándote el formulario es el "diseñador de formularios". Desde ahi puedes pinchar en el ToolBar para arrastrar controles al formulario, tales como botones o labels (esta es la forma "normal" de pintar el formulario, no tiene nada que ver con el hecho de que además hayamos construido un control personalizado). Al principio de ese toolbar te debería aparecer automáticamente el LabelEspecial si es que lo has compilado junto con el resto del proyecto. Si no aparece, siempre puedes hacer clic-derecho sobre el fondo gris del toolbar y seleccionar la opción "customize" y añadir a mano el nuevo control.
    domingo, 6 de septiembre de 2015 8:25
  • Alberto, creí entenderlo según tus explicaciones. El problema es que, a pesar de que lo he compilado junto con el resto del proyecto, al principio de ese toolbar no me aparece automáticamente el LabelEspecial como dices. Y con tu segunda opción de hacerlo manualmente con clic-derecho sobre el fondo gris del toolbar, tampoco me aparece. Mi programa está en español y las opciones que me aparecen con ese clic-derecho son las de la imagen que adjunto. No lo encuentro ni en las diversas pestañas de “Elegir elementos” ni al “Restablecer cuadro de herramientas”. ¿Estará mi fallo en que aparte de incluir la clase con el contenido que me enviaste como ejemplo habrá que añadir algo más en mi proyecto? Nuevamente mil perdones y mil gracias.

    domingo, 6 de septiembre de 2015 11:17
  • Te adjunto una imagen en la que se ve la barra de herramientas, la clase adjunta al proyecto, y el aspecto que tiene el Form cuando se arrastra la etiqueta personalizada. No he hecho nada para que salga la primera entrada en el Toolbox, simplemente con añadir un control al proyecto ya lo toma por defecto.

    Captura de pantalla

    Y a continuación otra imagen que muestra dónde sale la etiqueta cuando pinchas en la opción de añadir componentes en la barra de herramientas:

    Añadir componente

    domingo, 6 de septiembre de 2015 11:34
  • Ni del primer modo ni exactamente por el segundo medio me aparece el LabelEspecial. Gracias de todos modos. Seguiré investigando el problema. Muy agradecido.
    domingo, 6 de septiembre de 2015 11:41
  • Una cosa que puedes hacer: Si añadiste la clase simplemente con "añadir clase", haz la prueba de añadirla en su lugar al explorador de soluciones con la opción de "añadir control de usuario". Cuando lo añada, editas el código para que herede de "Control" en lugar de "UserControl", y luego en el interior de la clase pegas el OnPaint y la propiedad Text. A ver si así sí que te lo reconoce Visual Studio. Ojo, cuando añades el UserControl te mete todo el código en el archivo oculto .designer.vb mediante un partial class; el .vb te lo deja en blanco. Yo lo que hice es vaciar el .designer.vb y pegar la clase en el .vb.
    domingo, 6 de septiembre de 2015 11:55
  • Eres maravilloso. Ya me gustaría tener tu experiencia y sabiduría en el tema. Mi fallo era que la clase que me dijiste que añadiera lo hacía dentro del Form. Ahora lo he hecho en el Explorador de soluciones y todo perfecto. No sé cómo darte la máxima puntuación. No estoy muy enterado de esto en el Foro, pero lo intentaré. Muchísimas gracias por todo.
    domingo, 6 de septiembre de 2015 12:02