Graphics.MeasureString 可以计算出指定字符串在给定字体Font的尺寸SizeF,它的计算有坑:如果把字符串拆开成一个一个单字字符串并逐个计算尺寸,然后把Width加起来,你会发现并不一定等于完整的字符串计算出来的Width。
经过一番折腾,最终发现关键在于字符串中是否有空格。
举个例子
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
string foo = “ab c”;
float totalCharWidth = 0F;
for (int i = 0; i < foo.Length; i++)
{
float charWidth = g.MeasureString(foo.Substring(i, 1), SystemFonts.DefaultFont, 9999, StringFormat.GenericTypographic).Width;
Console.WriteLine(string.Format(“Char ‘{0}’ width : {1}”, foo.Substring(i, 1), charWidth));
totalCharWidth += charWidth;
}
Console.WriteLine(string.Format(“Total Char Width : {0}”, totalCharWidth));
Console.WriteLine(string.Format(“String ‘{0}’ Width : {1}”, foo, g.MeasureString(foo, SystemFonts.DefaultFont, 9999, StringFormat.GenericTypographic).Width));
执行结果
Char ‘a’ width : 6
Char ‘b’ width : 6
Char ‘ ‘ width : 0
Char ‘c’ width : 6
Total Char Width : 18
String ‘ab c’ Width : 24
字符串foo拆开后计算出来的Width总和为16,和foo完整计算出来Width24不同,关键问题显然是空格的Width居然为0。
经过测试,Graphics.MeasureString 计算字符串Width时会忽略掉头尾的空格后再进行计算,而夹在字符串中间的空格却会纳入计算(等于帮你给字符串自动做了次.Trim(),这坑是什么操作?),因此单独计算空格的Width实际上计算的空字符串的Width,因此为0。
所以,如果你希望单独得到空格的准确Width,简单的方法是:
1.计算出”a a”的Width1 => w1;
2.计算出”aa”的Width => w2;
3.用w1 – w2,就可以得到空格的Width。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36249.html