Question

Bien sûr, la méthode Graphics.Measurestring est bien connue pour avoir des problèmes de rembourrage, et vous utilisez donc des graphiques.

MeasureCharacterRanges problem

Cela ne mesure pas très correctement. Est-ce un problème avec MeasureCaracterRanges ou est-ce mon code? Comment puis-je le réparer?

Voici mon code:

    'Draw the selection cursor
    If Me.Focused Then
        Dim cX As Integer = 1, cY As Integer = 5, c As Char
        For i As Integer = 0 To Me.SelectionStart - 1
            c = Me.Text(i)

            If c = ControlChars.CrLf Then
                cY += Me.Font.Height
            Else
                Dim w As Integer = MeasureCharacter(g, c, Me.Font).Width
                g.DrawRectangle(Pens.Black, cX, cY, w, Me.Font.Height) 'Draw a rectangle for debugging
                cX += w
            End If
        Next

        g.DrawLine(Pens.Black, cX, cY, cX, cY + Me.Font.Height)
    End If
End Sub

Protected Function MeasureCharacter(ByVal g As Graphics, ByVal c As Char, ByVal f As Font) As Size
    Dim cr() As CharacterRange = {New CharacterRange(0, 1)}
    Dim sfmt As New StringFormat()
    sfmt.FormatFlags = StringFormatFlags.MeasureTrailingSpaces
    sfmt.SetMeasurableCharacterRanges(cr)
    Return g.MeasureCharacterRanges(c.ToString(), f, Me.ClientRectangle, sfmt)(0).GetBounds(g).Size.ToSize()
End Function
Était-ce utile?

La solution

La mesure de la longueur des caractères indiviuelles ne prend pas en compte leilage qui se produit entre des groupes de caractères, de sorte que la somme des longueurs des caractères ne sera pas égale à la longueur de la chaîne.

Si vous regardez votre exemple de texte, vous pouvez voir le coup entre le "T" à la fin de "Sprint" et le "T" au début de la "zone de texte", les personnages sont rapprochés que vous ne vous y attendez compte tenu de leur longueurs individuelles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top