【问题标题】:'TextRenderer.MeasureText' giving distinct size than 'Graphics.MeasureString''TextRenderer.MeasureText' 的大小与'Graphics.MeasureString' 不同
【发布时间】:2014-07-15 17:30:02
【问题描述】:

我想对于为什么这些方法总是返回不同的大小存在一个已知的说明,但无论如何我会稍微解释一下这个问题:

我对 Progressbar 进行了子类化,当我尝试使用相同字体获取相同文本的大小时,我得到了不同的值,TextRenderer.MeasureText给了我一个 13 高度的舍入值和300 宽度,而 Graphics.MeasureString 给我一个非常精确的高度 13,xxxxxx 和一个 275,xxxxxxx

的次要宽度

为什么会这样?

我没有在代码中做任何特别的事情,只是我尝试使用这两种方法来比较它是否给我相同的结果来决定在我的代码中使用哪个。

我尝试使用的TextRenderer.MeasureText 的重载是:

TextRenderer.MeasureText(String, Font)

Graphics.MeasureString 方法需要相同的参数:

Graphics.MeasureString(String, Font)

【问题讨论】:

  • 因为TextRender 返回一个SizeMeasureString 返回SizeF。根据您放置文本的位置,一个可能比另一个更合适...... FONT arg 通常更像thisCtl.Font,因此它是准确的。
  • 哦,很奇怪,因为两者都给了我一个 Single,但是我想 Size/SizeFloat 解释了一切……只是我想避免实例化一个 Graphics 对象只是为了测量里面的文本控件,您知道另一种无需创建图形对象即可提供 SizeF 结构的方法吗? PS:像往常一样,我说随时发布作为标记它的答案
  • 一个控件不应该需要使用MeasureString,但是275 vs 300似乎是错误的,这就是我提到Font的原因。您可能还希望包含控件的填充内容。
  • 好的,谢谢,解决了。 PS:我都用同一个字体测试过,控件使用的字体
  • 您可能想查看ProgressBarRenderer,如果您正在绘制一个,可能会定义内部边距,这会改变您的结果。没关系 - 没有它。 CheckBoxRender 为您提供支票的大小以及它与文本开头之间的边距。

标签: .net vb.net string winforms text


【解决方案1】:

TextRenderer.MeasureText 返回一个Size,所以这些值是整数。 Graphics.MeasureString 返回一个包含浮点数的 SizeF

不过,两者都是“原始值”。在测试某些文本是否适合某处时,您可能还需要考虑Control.Padding,每种类型可能以不同的方式实现。

275 与 300 似乎差异很大。我有一个复选框,它返回82, 13 vs `82.85806, 13.8251925)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2011-06-15
    • 2011-01-01
    相关资源
    最近更新 更多