zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    svn实现共享文件夹/文件或svn文件夹/文件链接
    插件的“动态替换”
    Swagger启动报错 swagger error creating bean with name documentationPluginsBoostrapper
    观察者模式的几种实现
    python flask 蓝图 多模块开发
    免安装版nginx,启动报错如下:./sbin/nginx: error while loading shared libraries: libpcre.so.0: cannot open shared object file: No such file or directory
    IDEA 支持JDK1.8的-parameters
    电脑自动开机+自动输入密码
    【小练习】立方体旋转
    消除if...else的十种方法
  • 原文地址:https://www.cnblogs.com/Johar/p/6537912.html
Copyright © 2011-2022 走看看