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 }