C# Winform Label內容根據其寬度自動調整字體大小
項目,有個要求,Label中顯示的內容,能夠根據其寬度自動調整字體的大小進行顯示,剛剛開始的時候,總是想着通過不同的方法來直接測量內容的顯示寬度,但是不同的字體,中英文,粗體斜體等眾多因數,都影響內容的顯示長度,直到后來想到間接的方法,通過修改Label的AutoSize屬性,再改變字體的大小,Label的寬度就是整個內容的顯示長度。有時候,思考的方式稍微轉換一下,問題可能就變得簡單。下面是調試時的demo程序,特此記錄一下,提醒自己,思考的方式很重要。
簡單的界面如下圖所示:
代碼如下:
1 using System; 2 using System.Drawing; 3 using System.Windows.Forms; 4 5 namespace Johar.AutoSizrLabel 6 { 7 public partial class Form1 : Form 8 { 9 private readonly FontStyle fontStyle = FontStyle.Regular; 10 private readonly float fontSize = 0; 11 private readonly int lblWidth = 0; 12 public Form1() 13 { 14 InitializeComponent(); 15 lblWidth = this.lblDisplay.Width; 16 fontSize = this.lblDisplay.Font.Size; 17 fontStyle = this.lblDisplay.Font.Style; 18 } 19 20 private void btnOK_Click(object sender, EventArgs e) 21 { 22 string content = this.txtInput.Text.Trim(); 23 FontFamily ff = new FontFamily(this.lblDisplay.Font.Name); 24 this.lblDisplay.Font = new Font(ff, fontSize, fontStyle, GraphicsUnit.World); 25 float size = this.lblDisplay.Font.Size; 26 27 /* 28 * 方法1:利用字體的寬度和字符串的長度相乘,大概算出整體字符串的實際長度 29 * (當然利用正則表達式區分中英文,計算出來的更加准確),再和Label的實際寬度 30 * 相比較,如果其大於Label的寬度,則減小當前字體的大小,直到字符串長度小於 31 * Label的寬度。 32 * 缺點:計算不准確,特別是字體為粗體,同時為了區別中英文,還要用正則表達式 33 * 比較麻煩。 34 */ 35 while (content.Length * size > lblWidth) 36 { 37 size -= 0.25F; 38 } 39 this.lblDisplay.Font = new Font(ff, fontSize, fontStyle, GraphicsUnit.World); 40 this.lblDisplay.Text = content; 41 42 /* 43 * 方法2:大體的思路和方法1相同,只是在測量字符串顯示的寬度時,使用了自帶的函數 44 * MeasureString 45 * 優缺點:雖然可以准確測量字符串的顯示長度,但是字體縮小后會顯示稱多行 46 */ 47 Graphics gh = this.CreateGraphics(); 48 SizeF sf = gh.MeasureString(content, this.lblDisplay.Font); 49 while (sf.Width > lblWidth) 50 { 51 size -= 0.25F; 52 this.lblDisplay.Font = new Font(ff, size, fontStyle, GraphicsUnit.World); 53 sf = gh.MeasureString(content, this.lblDisplay.Font); 54 } 55 this.lblDisplay.Text = content; 56 57 /* 58 * 方法3:大體思路和方法1相同,只是采用的測量字符串顯示的寬度時,偷懶了,先將Label的 59 * AutoSize屬性置為true,再改變其字體大小,使其寬度小於等於原來的寬度后顯示出來,並 60 * 恢復原來的設置。 61 * 優缺點:可以准確的測量字符串的顯示長度,同時可以保證只會顯示一行 62 */ 63 this.lblDisplay.AutoSize = true; 64 this.lblDisplay.Text = content; 65 while (this.lblDisplay.Width > lblWidth) 66 { 67 size -= 0.25F; 68 this.lblDisplay.Font = new Font(ff, size, fontStyle, GraphicsUnit.World); 69 } 70 this.lblDisplay.AutoSize = false; 71 this.lblDisplay.Width = lblWidth; 72 } 73 } 74 }