TextRenderer.MeasureText结果的准确性

时间:2009-07-06 14:04:04

标签: c# winforms textrenderer

按如下方式调用TextRenderer.MeasureText:

TextRenderer.MeasureText(myControl.Text, myControl.Font);

并将结果与​​控件的大小进行比较,以检查文本是否合适。结果有时是不正确的。观察了以下两个问题:

  • 通常,当Label设置为AutoSize时,TextRenderer将报告宽度比控件的自动大小宽度宽1个像素。
  • 假负面,其中TextRenderer报告的宽度小于控件的宽度,但文本仍然被切断。发生在“Estacióndetrabajo” - 不确定重音是否会以某种方式影响宽度计算?

有没有办法提高MeasureText方法的准确性?我应该调用接受设备上下文和/或格式标志的覆盖之一吗?

4 个答案:

答案 0 :(得分:7)

我知道这可能不再实际了。然而,对于未来的读者来说,这是一种在控件中测量文本的简单而准确的方法:

Graphics g=Graphics.FromHwnd(YOUR CONTROL HERE.Handle);
SizeF s=g.MeasureString("YOUR STRING HERE", Font, NULL, NULL, STRING LENGTH HERE, 1)

答案 1 :(得分:4)

  

有没有办法提高MeasureText方法的准确性?我应该调用接受设备上下文和/或格式标志的覆盖之一吗?

您已经自己回答了问题。实际上是基于Win32 DrawTextEx的MeasureText,如果没有有效的设备上下文,这个功能就无法工作。因此,当您在没有hdc的情况下调用MeasureText覆盖时,它会在内部创建与桌面兼容的hdc以进行测量。

当然,测量取决于额外的TextFormatFlags。另请注意,标签绘画(和测量)取决于UseCompatibleTextRendering

总的来说,你应该将MeasureText用于你自己的代码,例如当你用完全相同的参数调用DrawText时,在所有其他情况下,MeasureText返回的大小不能被视为精确。

如果您需要获得预期的标签大小,则应使用GetPreferredSize方法。

答案 2 :(得分:1)

我不知道我是否有一个完美的解决方案,但几年前我在做WinForms时遇到了这个问题。我最终补偿的方式是通过百分比调整返回的测量值。我不记得我使用了什么(可能是5%或105?),但我记得我最终在应用程序中使用了一个恒定的百分比并且总是向上舍入。

答案 3 :(得分:1)

查看此函数的TextFormatFlags参数:

TextRenderer::MeasureText(String, Font, Size, TextFormatFlags) 

http://msdn.microsoft.com/en-us/library/8wafk2kt.aspx

“使用指定字体在单行上绘制的文本的大小(以像素为单位)。您可以通过使用带有TextFormatFlags参数的DrawText重载之一来操纵文本的绘制方式。例如, TextRenderer的默认行为是将填充添加到绘制文本的边界矩形以容纳悬垂字形。如果需要绘制没有这些额外空格的文本行,则应使用带有Size和TextFormatFlags的DrawText和MeasureText版本参数。例如,请参阅MeasureText(IDeviceContext,String,Font,Size,TextFormatFlags)。“

HTH