• 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 }
  • 相关阅读:
    weka使用笔记1cluster内方法的使用
    RCP导出的错误解决
    hadoop 无法启动tasktrack 和jobtrack 解决办法
    前段技术
    数字信号处理 - chap1 采样
    数字信号处理 - chap5 数字信号频谱
    数字信号处理-chap3 滤波、差分方程、卷积
    数字信号处理 - Chap7 DFT和FFT (1)DFT基础
    数字信号处理 - chap2 数字信号
    数字信号处理 - Chap8 小波 (1)基础
  • 原文地址:https://www.cnblogs.com/Johar/p/6537912.html
Copyright © 2020-2023  润新知