Label控件如何根据字符串自定义大小

一、. this.label_Msg.AutoSize = false;  //设置label空件不能自动大小

二、. 用代码控制label控件的大小

     1.根据字符串、label的宽度 计算字符串的面积,函数如下:

 /// <summary>
        /// 计算字符串的面积
        /// </summary>
        /// <param name="msg">字符串</param>
        /// <param name="labelWidth">Label标签的宽度</param>
        /// <param name="labelFont">Label字体</param>
        /// <returns>字符串的面积</returns>
        private int GetMsgArea(string msg, float labelWidth, Font labelFont)
        {
            int msg_area = 0;
            if (msg.Contains('\n')) //含换行符
            {
                string[] msg_rows = msg.Split('\n');

                //测量每一行字符串的大小
                foreach (string msg_row in msg_rows)
                {
                    int msg_row_area = GetSingleLineStringArea(msg_row, labelWidth, labelFont);
                    msg_area += msg_row_area;
                }
            }
            else //单行字符串
            {
                msg_area = GetSingleLineStringArea(msg, labelWidth, labelFont);
            }
            return msg_area;
        }

        /// <summary>
        /// 测量单行字符串的面积
        /// </summary>
        /// <param name="str">单行字符串(不含换行符\n)</param>
        /// <param name="labelWidth">Label的宽度</param>
        /// <param name="labelFont">Label字体</param>
        /// <returns>单行字符串的面积</returns>
        private int GetSingleLineStringArea(string str, float labelWidth, Font labelFont)
        {
            Size size = TextRenderer.MeasureText(str, labelFont);
            Size singleWordLength = TextRenderer.MeasureText("", labelFont);
            int rowCountOfMsgInLabel = (int)Decimal.Ceiling((decimal)size.Width / (((decimal)labelWidth) - singleWordLength.Width)); //依据label宽度分隔字符串(label容纳字体宽度实际小于自身宽度)
            int msg_area = (int)(rowCountOfMsgInLabel * labelWidth * size.Height); //按label宽度分隔字符串成几行 * 行宽 * 行高
            return msg_area;
        }

 

     2.设置label的宽、高,直到label的面积可以容纳字符串,函数如下:

 /// <summary>
        /// 初始化消息标签
        /// </summary>
        private void InitLabelMsg()
        {
            string msg = this.message;
            msg = msg.Replace("\r", ""); //去掉影响测量的\r字符
            //msg = msg.Replace("\n", "");
            //计算字符串的面积
            int msg_area = this.GetMsgArea(msg, this.label_Msg.Width, this.label_Msg.Font);

            //根据面积计算是否可以容纳消息(label自动换行的,所以长度超出label长度没事。)
            int label_area = this.label_Msg.Width * this.label_Msg.Height;
            float label_new_width = this.label_Msg.Width;  //label的宽、高采用float型计算,精确
            float label_new_height = this.label_Msg.Height;
            int msg_new_area = 0;
            int label_new_area = 0;
            float formProportion = (float)this.Height / (float)this.Width; //窗体高宽比例
            if (msg_area > label_area) //超出面积
            {
                do
                {
                    label_new_width += 2;  //Label宽度增加
                    label_new_height += 2 * formProportion;  //Label高度按比例增加
                    msg_new_area = this.GetMsgArea(msg, label_new_width, this.label_Msg.Font);
                    label_new_area = (int)(label_new_width * label_new_height);
                    if (label_new_area >= msg_new_area) //新label大小够大了
                    {
                        break;
                    }
                } while (true);

                int dx = (int)label_new_width - this.label_Msg.Width;
                int dy = (int)label_new_height - this.label_Msg.Height;

                int formWidth = this.Width + dx;
                int formHeight = this.Height + dy;
                int maxFormWidth = 800;
                if (formWidth >= maxFormWidth) //最大宽度限制
                {
                    SetFormWidthFixed(msg, label_new_area, maxFormWidth);
                }
                else
                {
                    this.label_Msg.Width = (int)label_new_width; //Label Dock=Fill,不设置大小亦可
                    this.label_Msg.Height = (int)label_new_height;
                    this.Width = formWidth;  
                    this.Height = formHeight;
                }
            }
            this.label_Msg.Text = msg;
        }

 

    3.当label的面积过大时,可以在label外层包一个panel,设置panel.AutoScroll = true; 

   /// <summary>
        /// 设置Form宽度固定,计算label标签大小,Form自动出现滚动条
        /// </summary>
        /// <param name="msg">消息</param>
        /// <param name="label_area">当前label面积</param>
        /// <param name="formMaxWidth">Form最大宽度</param>
        private void SetFormWidthFixed(string msg ,int label_area , int formMaxWidth)
        {
            this.label_Msg.Dock = DockStyle.None;
            float label_width = formMaxWidth - this.label_Msg.Margin.Left - this.label_Msg.Margin.Right - 10; 
            float label_height = (int)((float)label_area / label_width); //大致新高度
            int msg_area = this.GetMsgArea(msg, label_width, this.label_Msg.Font);
            int label_new_area = label_area;
            do  //重新计算label的高度
            {
                label_height += 2;
                label_new_area = (int)(label_width * label_height);
                if (label_new_area >= msg_area)
                {
                    break;
                }
            } while (true);
            this.label_Msg.Width = (int)label_width;
            this.label_Msg.Height = (int)label_height;

            float formProportion = (float)this.Height / (float)this.Width; //窗体高宽比例
            this.Width = formMaxWidth;
            this.Height = (int)(formMaxWidth * formProportion);
            this.panel_Scroll.AutoScroll = true;
        }

 

三、效果图展示

 

转载于:https://www.cnblogs.com/hdwang/p/3962860.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过继承 Label 控件并重写其 OnPaint 方法来实现自定义 Label 控件,并在该控件中添加设置行距的功能。 以下是一个实现设置行距的自定义 Label 控件的示例代码: ```csharp using System.Drawing; using System.Windows.Forms; public class CustomLabel : Label { private int lineSpacing = 0; public int LineSpacing { get { return lineSpacing; } set { lineSpacing = value; } } protected override void OnPaint(PaintEventArgs e) { // 获取控件的文本内容 string text = this.Text; // 如果文本内容为空,则不需要绘制 if (string.IsNullOrEmpty(text)) { base.OnPaint(e); return; } // 获取控件的字体 Font font = this.Font; // 获取控件的前景色 Color foreColor = this.ForeColor; // 获取控件的绘图区域 RectangleF rect = new RectangleF(0, 0, this.Width, this.Height); // 创建绘图笔刷 Brush brush = new SolidBrush(foreColor); // 创建字符串格式化对象 StringFormat format = new StringFormat(); // 设置字符串格式化对象的行距属性 format.LineSpacing = lineSpacing; // 绘制文本内容 e.Graphics.DrawString(text, font, brush, rect, format); // 销毁绘图笔刷 brush.Dispose(); } } ``` 在这个示例中,我们重写了 Label 控件的 OnPaint 方法,首先获取了控件的文本内容、字体和前景色等属性,并创建了一个绘图笔刷和一个字符串格式化对象。 然后,我们设置了字符串格式化对象的 LineSpacing 属性,这个属性就是我们自定义的行距属性,它可以通过 LineSpacing 属性来设置。 最后,我们使用 Graphics 类的 DrawString 方法来绘制文本内容,其中传入了字符串格式化对象来实现行距的设置。 使用这个自定义 Label 控件的方法与使用普通的 Label 控件相同,只需要将控件的类型改为 CustomLabel 即可,然后就可以通过 LineSpacing 属性来设置行距了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值