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;
        }

三、效果图展示

时间: 2024-10-03 00:46:02

Label控件如何根据字符串自定义大小的相关文章

winform 可拖动的自定义Label控件

效果预览: 实现步骤如下: (1)首先在项目上右击选择:添加->新建项,添加自定义控件 (2)自定义的一个Label让它继承LabelControl控件,LabelControl控件是DevExpress控件库里面的一种,和Label控件差不多,想了解更多关于DevExpress控件,推荐到DevExpress控件论坛学习:http://www.dxper.net/ public partial class LabelModule : LabelControl (3)这个Label需要实现的Mo

自定义Label控件

最近开发过程中有一个需求就是修改label控件的模板,使其能够在鼠标移近的时候变成TextBox,从而方便输入,然后进行相应的修改,最终达到动态修改Label的目的,这里贴出相应的代码,并做简要的分析. 在上述例子中我们通过TemplateBinding来进行相应的绑定,并配合相应的Trigger来实现相关的效果,这里就此介绍一下!

[WP8.1UI控件编程]Windows Phone自定义布局规则

3.2 自定义布局规则 上一节介绍了Windows Phone的系统布局面板和布局系统的相关原理,那么系统的布局面板并不一定会满足所有的你想要实现的布局规律,如果有一些特殊的布局规律,系统的布局面板是不支持,这时候就需要去自定义实现一个布局面板,在自定义的布局面板里面封装布局规律的逻辑.那么我们这一节从一个实际的需求出发,来实现一个自定义规律的布局面板.我们这一小节要实现的布局规律是把布局面板里面的子元素,按照圆形的排列规则进行排列,下面我们来看下这个例子的详细实现过程. 3.2.1 创建布局类

ios UILabel(label控件)的详细使用及特殊效果

UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(0, 0, 75, 40)];   //声明UIlbel并指定其位置和长宽 label.backgroundColor = [UIColorclearColor];   //设置label的背景色,这里设置为透明色. label.font = [UIFont fontWithName:@"Helvetica-Bold" size:13];   //设置label的字体和字

activePDF Architect WBE 控件可动态产生自定义PDF文件,控制布局和页面元素

activePDF Architect WBE 控件提供了强健的API用于即时地构建完美的PDF报表.PDF表单等,可以添加文本.图像.表格.注释.表单字段等,并且可以完全控制格式和布局位置,直接从你应用程序产生高质量的PDF文档. 具体功能: 动态产生自定义PDF文件,控制布局和页面元素 从头开始构建PDF,使用强健的表格控件和其他工具创建专业的适合你商业标准的布局 整合交互式元素到PDF里,如超链接.表单字段.注释等 直接从应用程序或者数据库数据,快速且简便地创建大批量PDF文件 使用相似的

winform中,如何控制控件位置随窗体的大小改变而改变

winform中,如何控制控件位置随窗体的大小改变而改变 有如下3种方法: 方法1 [csharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MarkPrint

DevExpress XtraGrid网格控件示例六:自定义合并单元格

假设 "Order Date" 列中包含日期/时间值.如果视图的GridOptionsView.AllowCellMerge选项设置为true,若相邻两个单元格值是日期/时间值的话,这两个相邻单元格便会合并.下面的代码介绍了如何合并例单元格的日期部分,要覆盖默认的单元格合并机制,需要处理一下GridView.CellMerge事件. C# using DevExpress.XtraGrid.Views.Grid; // ... private void gridView1_CellMe

LayoutParams 命名的时候,最好用与子控件相关的字符串命名,

1 @Override 2 public View initView() { 3 RelativeLayout container = new RelativeLayout(UIUtils.getContext());// 容器 4 AbsListView.LayoutParams ctparams = new AbsListView.LayoutParams( 5 AbsListView.LayoutParams.MATCH_PARENT, UIUtils.dip2px(150)); 6 co

C# 带滚动条的Label控件

C# 带滚动条的Label控件,用鼠标选的时候还是有点闪烁: namespace 带滚动条的Label控件 { public class TextBoxLabel : System.Windows.Forms.TextBox { [DllImport("user32", EntryPoint = "HideCaret")] private static extern bool HideCaret(IntPtr hWnd); [DllImport("user