如果我使用下面的文字来计算文字宽度的大小,我会说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”来测量字符串宽度,仍然会有所不同。

为什么是这样?

最佳答案

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;

关于c# - MeasureString怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13173263/

10-09 13:41