c# 计算空格宽度像素_C# WinForm,Graphics.MeasureString 计算不准确的坑

c# 计算空格宽度像素_C# WinForm,Graphics.MeasureString 计算不准确的坑Graphics.MeasureString可以计算出指定字符串在给定字体Font的尺寸SizeF,它的计算有坑:如果把字符串拆开成一个一个单字字符串并逐个计算尺寸,然后把Width加起来,你会发现并不一定等于完整的字符串计算出来的Width。经过一番折腾,最终发现关键在于字符串中是否有空格。举个例子Graphicsg=Graphics.FromHwnd(IntPtr.Zero);stri…

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注