Visual Basic.NET - Duda con TextRenderer.MeasureText

 
Vista:
sin imagen de perfil

Duda con TextRenderer.MeasureText

Publicado por Leonardo (5 intervenciones) el 08/09/2016 19:43:50
Hola, estoy recién con VB.Net y no me resulta algo, tengo que obtener el ancho de un texto en pixeles pero no me resulta:

El código original lo saque del siguiente ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub DrawALineOfText(ByVal e As PaintEventArgs)
    ' Declare strings to render on the form.
    Dim stringsToPaint() As String = {"Tail", "Spin", " Toys"}
 
    ' Declare fonts for rendering the strings.
    Dim fonts() As Font = {New Font("Arial", 14, FontStyle.Regular), _
        New Font("Arial", 14, FontStyle.Italic), _
        New Font("Arial", 14, FontStyle.Regular)}
 
    Dim startPoint As New Point(10, 10)
 
    ' Set TextFormatFlags to no padding so strings are drawn together.
    Dim flags As TextFormatFlags = TextFormatFlags.NoPadding
 
    ' Declare a proposed size with dimensions set to the maximum integer value.
    Dim proposedSize As Size = New Size(Integer.MaxValue, Integer.MaxValue)
 
    ' Measure each string with its font and NoPadding value and draw it to the form.
    For i As Integer = 0 To stringsToPaint.Length - 1
        Dim size As Size = TextRenderer.MeasureText(e.Graphics, _
            stringsToPaint(i), fonts(i), proposedSize, flags)
        Dim rect As Rectangle = New Rectangle(startPoint, size)
        TextRenderer.DrawText(e.Graphics, stringsToPaint(i), fonts(i), _
            startPoint, Color.Black, flags)
        startPoint.X += size.Width
    Next
End Sub

Yo lo adapte al siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
For Columna = 0 To FlexGrid.Cols - 1
    FlexGrid.Col = Columna
 
    Dim stringsToPaint As String = FlexGrid.Text
    Dim fonts As Font = New Font(FlexGrid.FontName, FlexGrid.FontSize, FontStyle.Bold)
 
    ' Set TextFormatFlags to no padding so strings are drawn together.
    Dim flags As TextFormatFlags = TextFormatFlags.NoPadding
 
    ' Declare a proposed size with dimensions set to the maximum integer value.
    Dim proposedSize As Size = New Size(Integer.MaxValue, Integer.MaxValue)
 
    Dim size As Size = TextRenderer.MeasureText(????, stringsToPaint, fonts, proposedSize, flags)
 
    Col_Width = size.Width
    'Comparar cual es mayor
    If Ancho_Columna(Columna) < Col_Width Then
        Ancho_Columna(Columna) = Col_Width
    End If
Next

No me resulta por que no se donde o como sacar el valor de e ("ByVal e As PaintEventArgs"),

Se agradece cualquier ayuda
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Duda con TextRenderer.MeasureText

Publicado por Nacho (56 intervenciones) el 09/09/2016 10:40:39
O sea, que te falla lo más simple.

La función que has copiado recibe un e As PaintEventArgs. Esa variable e contiene datos sobre dónde pintar en un evento de pintado. Tú quieres saber lo que ocupará un texto pintado en un control. Lo que ocupe dependerá de cómo sea el canvas de ese control, así que necesita saber eso. Es como si te dicen que alguien tienen una estatura media, pero no es lo mismo una estatura media entre pigmeos que entre holandeses. Así que tienes que pasarle el Graphics del control donde quieras pintar ese texto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Duda con TextRenderer.MeasureText

Publicado por Leonardo (5 intervenciones) el 09/09/2016 13:47:57
Gracias!!

Agregue el siguiente codigo y me funciono, aunque no me da el tamaño correcto, pero creo que tiene que ver con la escala del objeto, pero ese es otro tema:

1
2
Dim g As Graphics
g = FlexGrid.CreateGraphics

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con TextRenderer.MeasureText

Publicado por Nacho (56 intervenciones) el 09/09/2016 15:53:21
Si estás creando un Graphics será porque estás cometiendo el típico error en Windows,consistente en pretender pintar en una función cualquiera. Una cosa es un Graphics que crees y otra el Graphics donde se vaya a pintar. En Windows hay que pintar en respuesta el mensaje WM_PAINT, y sus eventos. El mensaje WM_PAINT está, por ejemplo, sincronizado con la formación de la imagen en la pantalla, lo que evita parpadeos. En ese mensaje se manda un HDC, con información de dónde hay que pintar, que .net transforma en un Graphics. Si quieres pintar en un grid tienes para eso el CellPaint, que se manda al pintar cada celda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar