C#如何測量字符串的高度寬度和精確取得字符串的高度寬度


因為MFC中CDC有GetTextExtent()可以獲得字符串的高度寬度 像素單位,所以自然想到c#的GDI+的MeasureString,這個同樣是測量字符串高度寬度,但是這個不同於CDC,他不適用CDC.GetTextExtent()的適用領域,GDI+ MeasureString會自己處理矩形區域,返回這個矩形區域SizeF,這就是為什么是浮點而不是整數,它根本就不是字符串准確的高度寬度。 舉個例子:給定字符串s,用Graphics的MeasureString獲取高度寬度sizeF,並在一個給定的起點顯示以sizeF為高度寬度的矩形大小和字符串s

string s = " an English string and 一個中文字符串 " ;
Graphics g
= this .CreateGraphics();
g.PageUnit
= GraphicsUnit.Pixel;
g.SmoothingMode
= SmoothingMode.HighQuality;
StringFormat sf
= new StringFormat();
sf.FormatFlags
= StringFormatFlags.MeasureTrailingSpaces;
SizeF sizeF
= g.MeasureString(s, this .Font, 500 , sf);
g.DrawRectangle(Pens.Red,
new Rectangle( 100 , 400 , Convert.ToInt32(sizeF.Width), Convert.ToInt32(sizeF.Height)));
g.DrawString(s,
this .Font, new SolidBrush(Color.Green), 100 , 400 );

以100,400坐標位奇點繪制sizeF大小的矩形 和 字符串 改sizeF是測量該字符串得到的。

效果如下:(沒處理顯示質量 這個不是重點)注意'g'和'串'

說明Gdi+的MeasureString跟CDC的GetTextExtent完全不一樣 GDI+在字符串四周添加一些長度,以適應字符串絕對可以被測量得到的SizeF包裹住,而且在末尾添加的更多空白,大概是想包裹住文字單擊時的鼠標狀態。

類似上面的代碼,使用TextRender的MeasureText精確獲得包裹字符串的區域,效果如下:

區別在於字符串末尾增寬 和 對英文字符下部的增寬處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM