这不是一个四舍五入的问题。差异〜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,反之亦然。
TextRenderer使用GDI呈现文本,而Graphics使用GDI +。两者使用略微不同的方法来布置文本,因此大小不同。
TextRenderer
Graphics
您应该使用哪一个取决于最终将用于实际绘制文本的内容。如果要使用GDI +进行绘制Graphics.DrawString,请使用进行测量Graphics.MeasureString。如果使用GDI进行绘图,请使用进行TextRenderer.DrawText测量TextRenderer.MeasureText。
Graphics.DrawString
Graphics.MeasureString
TextRenderer.DrawText
TextRenderer.MeasureText
如果文本将显示在Windows Forms控件内,则使用TextRendererif UseCompatibleTextRendering设置为false(默认)。
UseCompatibleTextRendering
false
在问题的各行之间阅读,您似乎正在使用,TextRenderer因为事件Graphics外没有实例Paint。如果是这样,您可以自己创建一个进行测量:
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); }