none
¿Me ayudan a ubicar texto con DrawString? (explico). Tengo lo siguiente: RRS feed

  • Pregunta

  • Deseo ubicar un texto en un contenedor, un panel por ejemplo, que empiece en una posición X, que no supere un determinado ancho y que si el texto no cabe en el ancho que le ponga automáticamente puntos suspensivos.

    Tengo esto:

    Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint

         Dim nX = 10            'Que empiece en la posición X.

         Dim nAncho = 100   'Si el texto es más ancho de 100 que le agruegue puntos suspensivos.

          e.Graphics.DrawString("Aquí el texto", Font, New SolidBrush(Color.Red), ESTOS PARAMETROS ME FALTAN)

    End Sub

    Me parece que se puede hacer con la sobrecarga que tiene los parámetros LayoutRectangle y Format, pero no me queda claro cómo hacerlo.

    domingo, 22 de noviembre de 2020 12:15

Respuestas

  • Te sugiero que uses e.Graphics.MeasureString para medir cuánto ocupa al string. Si es menor que 100, lo escribes directamente. Si es mayor, entonces con un bucle vas quitando caracteres del final del string hasta que sea menor que 100 menos lo que midan los puntos suspensivos. Cuando alcances ese tamaño, escribes lo que quede del string más los puntos suspensivos.

    El problema de usar el LayoutRectangle es que simplemente trunca lo que sobre, pero no te añade los puntos suspensivos, por lo que no tienes indicación visual de que el texto ha sido truncado.

    domingo, 22 de noviembre de 2020 12:29
  • Deleted
    • Marcado como respuesta James2016-2 domingo, 22 de noviembre de 2020 17:41
    domingo, 22 de noviembre de 2020 12:38

Todas las respuestas

  • Te sugiero que uses e.Graphics.MeasureString para medir cuánto ocupa al string. Si es menor que 100, lo escribes directamente. Si es mayor, entonces con un bucle vas quitando caracteres del final del string hasta que sea menor que 100 menos lo que midan los puntos suspensivos. Cuando alcances ese tamaño, escribes lo que quede del string más los puntos suspensivos.

    El problema de usar el LayoutRectangle es que simplemente trunca lo que sobre, pero no te añade los puntos suspensivos, por lo que no tienes indicación visual de que el texto ha sido truncado.

    domingo, 22 de noviembre de 2020 12:29
  • Deleted
    • Marcado como respuesta James2016-2 domingo, 22 de noviembre de 2020 17:41
    domingo, 22 de noviembre de 2020 12:38
  • Gracias gran aporte.
    domingo, 22 de noviembre de 2020 15:24
  • Te sugiero que uses e.Graphics.MeasureString para medir cuánto ocupa al string. Si es menor que 100, lo escribes directamente. Si es mayor, entonces con un bucle vas quitando caracteres del final del string hasta que sea menor que 100 menos lo que midan los puntos suspensivos. Cuando alcances ese tamaño, escribes lo que quede del string más los puntos suspensivos.

    El problema de usar el LayoutRectangle es que simplemente trunca lo que sobre, pero no te añade los puntos suspensivos, por lo que no tienes indicación visual de que el texto ha sido truncado.

    Gracias, esa es una buena alternativa también, pero la otra es más directa, con la combinación de flag y formato se puede.
    domingo, 22 de noviembre de 2020 17:41
  • Dim cTexto = "abcdefghijklmnñopqrstuvwxyz"
    
    Dim nX = 10        'Que empiece en la posición X.
    Dim nAncho = 100   'Si el texto es más ancho de 100 que le agruegue puntos suspensivos.
    Dim nAlto = 50
    
    Dim sf = StringFormat.GenericTypographic
    sf.Alignment = StringAlignment.Near
    sf.LineAlignment = StringAlignment.Center
    sf.Trimming = StringTrimming.EllipsisCharacter
    sf.FormatFlags = StringFormatFlags.NoWrap
    
    e.Graphics.DrawString(cTexto, Font, New SolidBrush(Color.BurlyWood), New Rectangle(nX, 0, nAncho, nAlto), sf)

    Muchas gracias, esto es exactamente lo que trataba de hacer.
    domingo, 22 de noviembre de 2020 17:41
  • Hola,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    lunes, 23 de noviembre de 2020 14:42