TextRenderer.MeasureText结果的准确性

调用TextRenderer.MeasureText如下:

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

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

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

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

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

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

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

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

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

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

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

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

查看此函数的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)。“

心连心