MesureCaracterRanges n'est même pas exact?
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.
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
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.