C# WinForm Label 控件拓展—变色字体、超链接

本文介绍如何在WinForm中通过扩展Label控件实现部分文本具有不同颜色、下划线及超链接功能,并保持原有文本布局不变。文章提供了一个具体的实现案例,包括颜色变化、鼠标事件响应等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

以前做项目需要实现在文本类控件中加入超链接文字段的功能,在网上查了不少资料基本没有找到比较理想的实现方法,最后无奈只好自己实现了...

需求:

拓展Label控件,使其文本中的文字可以有多种颜色,添加下划线、做成超链、点击变色。变色文字的格局(间距、字体大小、换行)必须与原来一致。(注意做出改变的是部分文字,非整个文本)效果图如下:

图1

  

  图2  

 图3 

   

图1为WinForm原生Label的预览效果,图2、图3为拓展后的预览效果。                            

实现原理:

(1)准确测量文字区域

需要准确测量出文字段的大小才能保证文字格局的不变,GDI+已经自带了这种功能,可以得到指定文字段的System.Drawing.Region对象。但直接通过System.Drawing.Region对象获取的数据进行绘制的效果不太理想(未深入尝试),所以才有了(2)。

(2)异或刷前景

改变局部文字颜色的一种方法:①计算异或相关的颜色值,对局部区域做一次异或填充②绘制所有文字 ③使用与第一步同样的颜色对局部区域再做一次异或填充。

实现上述方法的条件:已知填充的区域、能控制整体文字绘制。

(3)开窗

底部加一层Label,在底部Label做变色,添加下划线效果,上层Label对变色部分开窗。--不算是个好方法,下滑线只能全局设置。

源码:

 https://download.youkuaiyun.com/download/u013113678/32897102

例子:




        /// 
        /// 应用程序的主入口点。
        /// 
        [STAThread]
        static void Main()
        {
            string exaple = @"It's a truth universally acknowledged,
that a single man in possession of
a good fortune must be in want of a wife.
凡是有钱的单身汉,总想娶位太太,
这已经成了一条举世公认的真理。";
           
            Form form = new Form();
            var cLabel = new ColorLabel();
            Font font = new System.Drawing.Font("Times New Roman", 13, FontStyle.Regular);
            var colorEx = cLabel.ColorEx; //取得拓展对象
            cLabel.Font = font;
            cLabel.Text = exaple;
            cLabel.Size = cLabel.PreferredSize;
            //设置分段的颜色
            colorEx.Add(1, 5).ForeColor = System.Drawing.Color.Orange;
            colorEx.Add(8, 5).ForeColor = System.Drawing.Color.Blue;
            colorEx.Add(47, 8).ForeColor = System.Drawing.Color.Green;
            //设置为带下滑线
            colorEx.UnderLine = true;
            var range = colorEx.Add(60, 80);
            range.ForeColor = System.Drawing.Color.Teal;//前景色
            range.PressedColor = System.Drawing.Color.Gold;//按下后的颜色
            range.Pressabled = true;//设置为可以按下

              colorEx.Events.Click += (S, E) =>
            {
                //TODO:输入测试代码
            };
            colorEx.Events.MouseClick += (S, E) =>
            {
                //TODO:输入测试代码
            };
            colorEx.Events.MouseDown += (S, E) =>
            {
                //TODO:输入测试代码
            };
            colorEx.Events.MouseUp += (S, E) =>
            {
                MessageBox.Show(E.Range.Text);    
            };


            form.Controls.Add(cLabel); 
            form.StartPosition = FormStartPosition.CenterScreen;
            form.Size = form.PreferredSize;
            form.ShowDialog();
        }



//或者可以
        /// 
        /// 应用程序的主入口点。
        /// 
        [STAThread]
        static void Main()
        {
            var label = new Label();
            var colorEx = new ColorLabelExtension(label); //外部拓展Label
            //TODO:自定义逻辑代码
            
        }


其他:
限定:不兼容Label的Padding属性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeOfCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值