MeasureCharacterRanges даже не точный? - PullRequest
1 голос
/ 18 мая 2011

Конечно, метод Graphics.MeasureString, как известно, имеет проблемы с заполнением, поэтому вместо него вы используете Graphics.MeasureCharacterRanges, но, как вы можете видеть здесь:

MeasureCharacterRanges problem

Это не совсем правильно. Это проблема с MeasureCharacterRanges или это мой код? Как я могу это исправить?

Вот мой код:

    '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

1 Ответ

3 голосов
/ 18 мая 2011

Измерение длины отдельных символов не учитывает кернинг, который происходит между группами символов, поэтому сумма длин символов не будет равна длине строки.

Если выпосмотрите на текст вашего примера, вы можете увидеть кернинг между буквой "t" в конце "Sprint" и буквой "T" в начале "Textbox", символы смещены ближе друг к другу, чем вы ожидаете, учитывая их индивидуальную длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...