一尘不染

TextRenderer.MeasureText和Graphics.MeasureString大小不匹配

c#

这不是一个四舍五入的问题。差异〜5+像素。

测试用例字符串:“” MACD(26,12,9)-0.000016“

e.Graphics.MeasureString("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width)
TextRenderer.MeasureText("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width)

结果始终是:

139.3942
134

为什么尺寸有这么大的差异?我只需要外部绘画方法的字符串宽度的一轮。但是它应该匹配MeasureString,反之亦然。


阅读 649

收藏
2020-05-19

共1个答案

一尘不染

TextRenderer使用GDI呈现文本,而Graphics使用GDI +。两者使用略微不同的方法来布置文本,因此大小不同。

您应该使用哪一个取决于最终将用于实际绘制文本的内容。如果要使用GDI
+进行绘制Graphics.DrawString,请使用进行测量Graphics.MeasureString。如果使用GDI进行绘图,请使用进行TextRenderer.DrawText测量TextRenderer.MeasureText

如果文本将显示在Windows Forms控件内,则使用TextRendererif
UseCompatibleTextRendering设置为false(默认)。

在问题的各行之间阅读,您似乎正在使用,TextRenderer因为事件Graphics外没有实例Paint。如果是这样,您可以自己创建一个进行测量:

using( Graphics g = someControl.CreateGraphics() )
{
    SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
}

如果您无权创建图形实例的控件,则可以使用该控件为屏幕创建一个实例,该控件可以很好地用于测量目的。

using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) )
{
     SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
}
2020-05-19