转自:https://www.cnblogs.com/MRRAOBX/articles/7473803.html
我在将字符串(含中文)Draw到一幅图片上时发现不准这个问题的。
比如一幅图片的宽是400pixel,Graphics对象g的GraphicUnit是Pixel,我要画到图上的字符串是str,我用g.MeasureString(str.SubString(0,i),font)来计算前i个字符的宽度width.当width大于宽度时,停止循环,并将前i个字符画到图片上(使得文字靠右对齐),查看画完的图片发现图上前i个字符的后面还有很大一段空白(前i的字符的宽度明显小于图片的宽),
使用Graphic类的MeasureString可以得到在某种字体下,字符串的显示长度。
但对于字符串尾部是空格的地方将会被忽略,无论是全角还是半角。
比如:
" str"与" str ",使用这个方法来测量时,得出来的Width都是相同的。
MeasureString默认情况下确实要偏大一点,需要额外设置stringFormat,举个例子
e.Graphics.MeasureString(text, Font,1000,StringFormat.GenericTypographic)
这样就能正确测量了。
MeasureString并不支持度量给定宽度时,所需要的高度的功能,只能量出将所有的字画在一行上的宽度和高度。
可以参考一下:http://blog.joycode.com/sam1111/archive/2004/11/08/38393.aspx
(1)在窗体中测量字符串
使用System.Drawing.Graphics的MeasureString函数 主要用它的2个重载函数
(1)Graphics.MeasureString 方法 (String, Font) ,测量用指定的 Font 对象绘制的指定字符串,返回 SizeF 结构。返回的SizeF就是测量字符串的打印在屏幕上的宽度和高度,默认以像素为单位,与Form中控件Size的单位一致。该函数重载中还含有一个 StringFormat参数,如果未指定这个参数,那么将使用StringFormat.GenericDefault返回的StringFormat进行测量,这个测量结果比较大。如果使用StringFormat.GenericTypographic参数测量,结果比较小。
(2)public SizeF MeasureString(string text,Font font,SizeF layoutArea,StringFormat stringFormat, out int charactersFitted, out int linesFilled); 这个函数能测量使用指定字体和指定矩形区域中能容纳字符串的长度和行数,其中,layoutArea为一个容纳字符串的矩形区域; stringFormat为字符串的对齐方式,字符间距,是否保持词组在同一行等属性(这个参数很重要);charactersFitted返回能容纳的字符的数目;linesFilled返回能容纳字符的行数。 重点:默认的情况下Graphics返回的结果是用像素作为单位,设置PageUnit属性可以改变这种状态。窗体中创建Graphics实例直接可以使用Control.CreateGraphics 方法。