MeasureString奇怪的行为

时间:2012-11-01 08:13:55

标签: c# gdi+

如果我使用下面的文字宽度来计算尺寸,那就给我说500

intWidth = (int)objGraphics.MeasureString(String.concat(sImageText1, sImageText2), objFont).Width;

但如果我喜欢这个

intWidth = (int)objGraphics.MeasureString(sImageText1, objFont).Width + (int)objGraphics.MeasureString(sImageText2, objFont).Width;

我搜索很多并且已经做了很多不同的场景但是如果我们使用带有全文或部分的“MeasureString”测量字符串宽度仍然会有所不同。

为什么会这样?

1 个答案:

答案 0 :(得分:6)

The documentation有答案:

  

MeasureString方法设计用于单个字符串,在字符串之前和之后包含少量额外空格以允许悬垂字形。此外,DrawString方法调整字形点以优化显示质量,并可能显示比MeasureString报告的字符串更窄的字符串。 要获取适合布局中相邻字符串的度量标准(例如,在实现格式化文本时),请使用MeasureCharacterRanges方法或采用StringFormat的MeasureString方法之一,并传递GenericTypographic。另外,请确保TextRenderingHint对于图形是AntiAlias。

强调的部分与此相关。

要修复代码,请添加必要的参数:

intWidth = (int)objGraphics.MeasureString(sImageText1, objFont, 1024, Stringformat.GenericTypographic).Width
           + (int)objGraphics.MeasureString(sImageText2, objFont, 1024, StringFormat.GenericTypographic).Width;