首页 > 其他分享 >winform 动态截断或者补全文字宽度

winform 动态截断或者补全文字宽度

时间:2024-07-16 13:41:34浏览次数:11  
标签:end 补全 start pos expectedStr 截断 var string winform

使用 TabControl 时,发现它的选项卡宽度会随文字长度变化,我自己做了一个浏览器,发现很难看,于是写了上算法,对文字长度进行填充或截断,效果很不错:

 

调用代码:
using (var g = tabs.CreateGraphics())
{
    tabPage.Text = "  " + PadAndEllipsis(g, tabs.Font, title, 150) + "  " ;
}

核心函数:

/// <summary>
/// 长度不够用空格前后填充,长度超过则截断并添加...
/// </summary>
/// <param name="g"></param>
/// <param name="font"></param>
/// <param name="str"></param>
/// <param name="maxWith"></param>
/// <returns></returns>
string PadAndEllipsis(Graphics g, Font font, string str, int maxWith)
{
    Func<string, float> getActualWidth = delegate (string text)
    {
        return g.MeasureString("|" + text + "|", font).Width - g.MeasureString("||", font).Width;
    };

    var originalWidth = getActualWidth(str);
    var expectedStr = str;

    //字符串增加空格使它突破宽度
    if (originalWidth < maxWith)
    {
        const string fillstr = " ";

        //快速填充使其超过标准宽度
        do
        {
            expectedStr = expectedStr + string.Concat(Enumerable.Repeat(fillstr, expectedStr.Length));
        } while (getActualWidth(expectedStr) < maxWith);

        //使用二分查找法
        var start = 0;
        var end = expectedStr.Length;
        while (start < end)
        {
            var pos = start + (int)Math.Ceiling(((double)end - start) / 2);
            if (getActualWidth(expectedStr.Substring(0, pos)) > maxWith)
            {
                if (end == pos)
                    break;
                end = pos;
            }
            else
            {
                if (start == pos)
                    break;
                start = pos;
            }
        }

        var padding = string.Concat(Enumerable.Repeat(fillstr, (end - str.Length) / 2));
        var result = padding + str + padding;
        var w = getActualWidth(result);
        return result;
    }
    else
    {
        const string suffixstr = "...";

        //使用二分查找法
        var start = 0;
        var end = expectedStr.Length;
        while (start < end)
        {
            var pos = start + (int)Math.Ceiling(((double)end - start) / 2);
            if (getActualWidth(expectedStr.Substring(0, pos) + suffixstr) > maxWith)
            {
                if (end == pos)
                    break;
                end = pos;
            }
            else
            {
                if (start == pos)
                    break;
                start = pos;
            }
        }

        var result = str.Substring(0, start) + suffixstr;
        return result;
    }
}

 

标签:end,补全,start,pos,expectedStr,截断,var,string,winform
From: https://www.cnblogs.com/nanfei/p/18305049

相关文章

  • DevExpress WinForms自动表单布局,创建高度可定制用户体验(一)
    使用DevExpressWinForms的表单布局组件可以创建高度可定制的应用程序用户体验,从自动安排UI控件到按比例调整大小,DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务......
  • C# WinForm框架入门与基本控件使用详解
    一.Winform入门​WinForm是WindowsForm的简称,是基于.NETFramework平台的客户端(PC软件)开发技术,一般使用C#编程。在VS2019中,C#WinForm编程需要创建「Windows窗体应用程序」项目。Windows窗体应用程序是C#语言中的一个重要应用,也是C#语言最常见的应用。使用......
  • docker 命令无法自动补全
    报错问题:"docker命令无法自动补全"通常指的是命令行自动补全功能没有为 docker 命令启用。解决方法:确保你正在使用的是Bashshell。安装并使用 bash-completion 脚本。对于Ubuntu/Debian系统,可以使用以下命令安装:sudoapt-getinstallbash-completion对于......
  • Linux捣鼓记录:debian配置自动补全、ll命令别名、配置sbin命令、jdk命令
    一、配置自动补全、ll命令别名配置在/etc/bash.bashrc,实现全局用户自动补全,ll命令别名sudonano/etc/bash.bashrc有一段类似下面的文字被注释,取消注释#enablebashcompletionininteractiveshellsif!shopt-oqposix;thenif[-f/usr/share/bash-completion/bas......
  • C# winform e.Graphics.DrawString 旋转打印一例
    前段时间的合格证标签打印老是卡纸,车间将纸竖过来放卡纸少很多,程序也要做修改,在原程序上加了以下两行代码;e.Graphics.TranslateTransform(285,685);e.Graphics.RotateTransform(-90.0F);第一行的两个坐标,要一点一点调试,没有找到什么科学的......
  • C# Winform之propertyGrid控件分组后排序功能
    在WinForms的PropertyGrid控件中,你可以通过多种方式对属性进行排序,包括按类别(Category)排序以及按属性名称排序。默认情况下,PropertyGrid控件会根据[Category]和[DisplayName]属性装饰器对属性进行分组和排序。如果你想要自定义排序规则,你可以通过以下几种方法:使用......
  • C# Winform之propertyGrid控件使用详解和分组设置
    PropertyGrid控件在WinForms中是一个非常有用的工具,它允许用户查看和编辑一个对象的属性。这个控件非常适合用于配置对话框或任何需要动态显示对象属性的地方。下面我会详细介绍PropertyGrid的使用方法和如何对属性进行分组。使用详解1.添加 PropertyGrid 控件在Vi......
  • winform窗体DataGridView合并单元格处理
    文本是使用SunnyUI的UIDataGridView控件进行演示的,同样适用于System.Windows.Forms.DataGridView控件具体需求如下,下表是个成绩表,其中姓名、总分、平均分这三列信息重复,需要对数据表进行合并单元格处理。 实现该需求需要两个步骤:1.给表格添加单元格重绘事件 在方法uiDataG......
  • DevExpress(WinForms & WPF)中文教程 - 如何减小文档文件大小?
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress近期重要版本v24.1已正式发布,该版本拥有众多新产品和数十个具有高影响力的功......
  • IDEA无法识别sql进行补全
    使用的是2023版idea,遇到sql语句无法被识别的问题,不会出现代码补全尝试多次后找到解决办法。将图中的None进行修改统一改为Mysql保存以后问题解决。(前提是在idea已经成功连接数据库)......