这不是一个四舍五入的问题。差异〜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 +。两者使用略微不同的方法来布置文本,因此大小不同。

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

如果文本将显示在Windows Forms控件中,则在TextRenderer设置为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);
}

关于c# - TextRenderer.MeasureText和Graphics.MeasureString大小不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6704923/

10-09 13:41