TextRenderer.MeasureText结果的准确性

Aid*_*yan 4 c# textrenderer winforms

调用TextRenderer.MeasureText如下:

TextRenderer.MeasureText(myControl.Text, myControl.Font);
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 8

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

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


arb*_*ter 6

有什么方法可以提高MeasureText方法的准确性吗?我应该调用接受设备上下文和/或格式标志的替代之一吗?

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

当然,度量取决于其他TextFormatFlags。另外请记住,标签绘画(和度量)取决于UseCompatibleTextRendering

因此,一般的结论是您应该对自己的代码使用MeasureText,例如,当您随后使用完全相同的参数调用DrawText时,在所有其他情况下,MeasureText返回的大小不能视为精确值。

如果需要获取预期的Label大小,则应使用GetPreferredSize方法。