如何使用 TextRenderer 正确测量字符串中的字符?

How to correctly measure characters in string using TextRenderer?

我正在尝试绘制多色字符串。

由于没有默认方法来执行此操作,我尝试使用 TextRenderer.DrawText 自己绘制字符串 char,但是,当我尝试测量字符串时,它没有正确报告第一个字符宽度.

为了一个字符一个字符地绘制,我遍历测量前一个字符宽度的字符串,以找到下一个要绘制的字符的位置。

为了获得宽度,我使用:

       TextRenderer.MeasureText(word.Substring(0, i),
                    drawFont,
                    new Size(int.MaxValue, int.MaxValue),
                    (TextFormatFlags.Left | TextFormatFlags.NoPadding)).Width

它正常工作,但对于第一个字符,它生成如下输出:

      L OREMIPSUM

基本上,如果只有一个字符 - 尽管有我的标志,它仍会使用填充来衡量它。

我可以使用:

      TextRenderer.MeasureText(String.Concat("*", chr.ToString(), "*"), font).Width - TextRenderer.MeasureText("**", font).Width

测量第一个字符并获得正确的宽度值,但当应该有更好的方法可用时,感觉我正在做一些 hack。

我也可以在上面的方法中使用字符串来避免使用 TextRenderer.MeasureText 并且仍然得到正确的结果而没有第一个字符的问题。

在我的案例中,测量字符的正确方法是什么?

你应该使用 MeasureString from the graphics object. Also take a look at TextRenderer.MeasureText and Graphics.MeasureString mismatch in size。它将解释差异。