美文网首页
C# WinForm,Graphics.MeasureStrin

C# WinForm,Graphics.MeasureStrin

作者: chaopi | 来源:发表于2020-09-08 22:23 被阅读0次

    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

    相关文章

      网友评论

          本文标题:C# WinForm,Graphics.MeasureStrin

          本文链接:https://www.haomeiwen.com/subject/oxzjektx.html