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完整计算出来Width24不同,关键问题显然是空格的Width居然为0。

经过测试,Graphics.MeasureString 计算字符串Width时会忽略掉头尾的空格后再进行计算,而夹在字符串中间的空格却会纳入计算(等于帮你给字符串自动做了次.Trim(),这坑是什么操作?),因此单独计算空格的Width实际上计算的空字符串的Width,因此为0。

所以,如果你希望单独得到空格的准确Width,简单的方法是:
1.计算出"a a"的Width1 => w1;
2.计算出"aa"的Width => w2;
3.用w1 - w2,就可以得到空格的Width

上一篇下一篇

猜你喜欢

热点阅读