前言:
以前做项目需要实现在文本类控件中加入超链接文字段的功能,在网上查了不少资料基本没有找到比较理想的实现方法,最后无奈只好自己实现了...
需求:
拓展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:自定义逻辑代码
}