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

Ase*_*tam 26 c# gdi+

这不是一个四舍五入的问题.差异~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)
Run Code Online (Sandbox Code Playgroud)

结果总是:

139.3942
134
Run Code Online (Sandbox Code Playgroud)

为什么尺寸差异如此之大?我只需要在外面绘制圆形宽度的方法.但它应该与MeasureString匹配,反之亦然.

Sve*_*ven 58

TextRenderer使用GDI渲染文本,而Graphics使用GDI +.两者使用略有不同的方法来布局文本,因此尺寸不同.

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

如果文本将显示在Windows窗体控件中,则使用TextRendererif UseCompatibleTextRendering设置为false(这是默认值).

在您的问题的行之间阅读,您似乎正在使用,TextRenderer因为您GraphicsPaint事件之外没有实例.如果是这种情况,您可以自己创建一个来进行测量:

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

如果您无权访问控件以创建图形实例,则可以使用此操作为屏幕创建一个控件,该工具可用于测量目的.

using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) )
{
     SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
}
Run Code Online (Sandbox Code Playgroud)

  • @Aseem:对于`TextRenderer.MeasureText`和`Graphics.MeasureString`来说,返回不同的结果显然很正常.如果你没有控件实例,你可以为整个屏幕创建一个`Graphics`实例; 我已经更新了我的答案. (3认同)