C# WinForm,Graphics.MeasureStrin
2020-09-08 本文已影响0人
chaopi
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
完整计算出来Width
24不同,关键问题显然是空格的Width
居然为0。
经过测试,Graphics.MeasureString
计算字符串Width
时会忽略掉头尾的空格后再进行计算,而夹在字符串中间的空格却会纳入计算(等于帮你给字符串自动做了次.Trim()
,这坑是什么操作?),因此单独计算空格的Width
实际上计算的空字符串的Width
,因此为0。
所以,如果你希望单独得到空格的准确Width
,简单的方法是:
1.计算出"a a"的Width1
=> w1;
2.计算出"aa"的Width
=> w2;
3.用w1 - w2,就可以得到空格的Width
。