1

もちろん、Graphics.MeasureStringメソッドにはパディングの問題があることがよく知られているため、代わりにGraphics.MeasureCharacterRangesを使用しますが、次のようになります。

MeasureCharacterRangesの問題

正確に測定されていません。これは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
4

1 に答える 1

3

個々の文字の長さを測定する場合、文字のグループ間で発生するカーニングは考慮されないため、文字の長さの合計は文字列の長さと等しくなりません。

サンプルテキストを見ると、「Sprint」の最後の「t」と「Textbox」の最初の「T」の間のカーニングがわかります。文字は、予想よりも近くに移動しています。個々の長さ。

于 2011-05-18T03:25:35.077 に答える