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 }

 

posted @ 2017-03-12 14:56  Johar  阅读(21918)  评论(0编辑  收藏  举报