C# TextRenderer.MeasureText结果的准确性

C# TextRenderer.MeasureText结果的准确性,c#,winforms,textrenderer,C#,Winforms,Textrenderer,调用TextRenderer.MeasureText如下: TextRenderer.MeasureText(myControl.Text, myControl.Font); 并将结果与控件的大小进行比较,以检查文本是否合适。结果有时是不正确的。我们注意到以下两个问题: 通常,当标签设置为“自动调整大小”时,TextRenderer将报告比控件的自动调整大小宽度宽1像素的宽度 如果TextRenderer报告的宽度小于控件的宽度,但文本仍被截断,则为假阴性。这发生在“Estación de

调用TextRenderer.MeasureText如下:

TextRenderer.MeasureText(myControl.Text, myControl.Font);
并将结果与控件的大小进行比较,以检查文本是否合适。结果有时是不正确的。我们注意到以下两个问题:

  • 通常,当标签设置为“自动调整大小”时,TextRenderer将报告比控件的自动调整大小宽度宽1像素的宽度
  • 如果TextRenderer报告的宽度小于控件的宽度,但文本仍被截断,则为假阴性。这发生在“Estación de trabajo”中——不确定重音是否会影响宽度计算

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

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

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

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

当然,度量取决于额外的TextFormatFlags。还要记住,标签的绘制(和测量)取决于

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


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

检查此函数的TextFormatFlags参数:

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

用指定字体在单行上绘制的文本的大小(以像素为单位)。您可以使用一个采用TextFormatFlags参数的DrawText重载来操纵文本的绘制方式。例如,TextRenderer的默认行为是向绘制文本的边框添加填充,以适应悬垂图示符。如果需要在没有这些额外空格的情况下绘制一行文本,则应使用带有Size和TextFormatFlags参数的DrawText和MeasureText版本。有关示例,请参见MeasureText(IDeviceContext、字符串、字体、大小、TextFormatFlags)。”


hth

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

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

处理假阴性的有趣想法。可以作为故障保护,但我最感兴趣的是理解大小差异的原因。谢谢。我正在检查翻译的文本是否适合控件,而不是绘制我自己的文本。你知道如何获取现有控件的TextFormatFlags吗?@Aidan,查看框架s源代码是唯一的方法。但如果布局取决于MesureLayout,则最好重新设计布局,使用控件的自动调整大小,以及TableLayoutPanel或FlowLayoutPanel来安排自动调整大小的控件。停靠也是一个选项。请注意,要进行我尝试进行的特定比较(检查文本是否适合),将Size.Empty传递给GetPreferredSize,并与实际的Control.Size进行比较。