C# Winform Label內容根據其寬度自動調整字體大小


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 }

 


免責聲明!

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



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