5

调用 TextRenderer.MeasureText 如下:

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

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

  • 通常,当 Label 设置为 AutoSize 时,TextRenderer 会报告比 Control 的自动调整宽度宽 1 个像素的宽度。
  • TextRenderer 报告的宽度小于控件的宽度但文本仍被截断的错误否定。这发生在“Estación de trabajo”——不确定重音是否会以某种方式影响宽度计算?

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

4

4 回答 4

8

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

Graphics g=Graphics.FromHwnd(YOUR CONTROL HERE.Handle);
SizeF s=g.MeasureString("YOUR STRING HERE", Font, NULL, NULL, STRING LENGTH HERE, 1)
于 2011-03-10T11:08:20.073 回答
6

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

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

当然,测量取决于额外的 TextFormatFlags。另请记住,标签绘制(和测量)取决于UseCompatibleTextRendering

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

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

于 2009-07-06T14:23:24.567 回答
3

查看此函数的 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、字符串、字体、大小、TextFormatFlags)。”

hth

于 2009-12-18T11:35:48.373 回答
1

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

于 2009-07-06T14:17:14.903 回答