同事詢問要如何知道字串的寬度。
我們可以使用 Graphics.MeasureString 來計算,
但為什麼算出來的會比實際的還寬呢?
查看網路上 GDI+ 預設會為每個顯示的字加上 (1/6 em),
所以算出來就會比實際值還大。
所以我們可以多設定 StringFormat.GenericTypographic 就可以取到實際的 Width 。
string s = "To. ";
using (var image = new Bitmap(1, 1))
{
using (var g = Graphics.FromImage(image))
{
//單位
g.PageUnit = GraphicsUnit.Millimeter;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
//font
Font f = new Font("Times New Roman", 14, FontStyle.Regular);
var romanSize = g.MeasureString(s, f, int.MaxValue, StringFormat.GenericTypographic);
Console.WriteLine($"Times New Roman Height:{romanSize.Height}, Width:{romanSize.Width}");
f = new Font("標楷體", 14, FontStyle.Regular);
var kaiuSize = g.MeasureString(s, f, int.MaxValue, StringFormat.GenericTypographic);
Console.WriteLine($"標楷體 Height:{kaiuSize.Height}, Width:{kaiuSize.Width}");
}
}
Console.ReadLine();
參考資料
Why is Graphics.MeasureString() returning a higher than expected number?
Measure a String without using a Graphics object?
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^