【问题标题】:Accuracy of TextRenderer.MeasureText resultsTextRenderer.MeasureText 结果的准确性
【发布时间】:2009-07-06 14:04:04
【问题描述】:

调用TextRenderer.MeasureText如下:

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

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

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

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

【问题讨论】:

    标签: c# winforms textrenderer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 谢谢。我正在检查翻译的文本是否适合控件,而不是绘制我自己的文本。你知道如何获取现有控件的 TextFormatFlags 吗?
      • @Aidan,查看框架源代码是唯一的方法。但是如果它依赖于 MesureLayout,最好重新设计你的布局,使用控件的 AutoSize,以及 TableLayoutPanel 或 FlowLayoutPanel 来排列你的自动调整大小的控件。对接也是一种选择。
      • 请注意,要进行我尝试进行的特定比较(检查文本是否适合),请将 Size.Empty 传递给 GetPreferredSize 并与实际的 Control.Size 进行比较。
      【解决方案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, String, Font, Size, TextFormatFlags)。"

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 处理假阴性的有趣想法。作为故障保险可能很好,但我最感兴趣的是了解尺寸差异的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多