博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
厌倦了ListBox打印消息,使用RichTextBox试试吧
阅读量:4921 次
发布时间:2019-06-11

本文共 4779 字,大约阅读时间需要 15 分钟。

背景

  Winform打印后台线程运行时消息,习惯用ListBox,有时候某行消息过长,设置个Tooltip控件提示全部信息。后来无意中看到同事使用RichTextBox打印消息,然后在不同的消息类别上加以不同的颜色做区分,倒也不失为一种办法,自己觉得这样还不错,于是找了资料,然后做成例子,特意分享一下。

  常用的消息类别:正常信息、警告信息、错误信息。具体效果见下文。

资源下载

  

  

实现

  主要打印有颜色消息的方法如下:

public static void AppendMsg(this RichTextBox richTextBox1, Color color, string text)        {            richTextBox1.BeginInvoke(new ThreadStart(() =>            {                lock (richTextBox1)                {                    //为控件输入焦点                    richTextBox1.Focus();                    //检查文本框过长                    if (richTextBox1.TextLength > 10000)                    {                        richTextBox1.Clear();                    }                    //得到有格式的文本                     using (var temp = new RichTextBox())                    {                        temp.SelectionColor = color;                        if (AutoTime)                            temp.AppendText(DateTime.Now.ToString("HH:mm:ss   "));                        temp.AppendText(text);                        //追加文本                        richTextBox1.Select(richTextBox1.Rtf.Length, 0);                        richTextBox1.SelectedRtf = temp.Rtf;                    }                    //设定光标所在位置                     //richTextBox1.SelectionStart = richTextBox1.TextLength;                    //滚动到当前光标处                     //richTextBox1.ScrollToCaret();                }            }));        }

  封装了Info,Warn,Error等方法。

public static partial class ExtendMethod    {        //控制是否在打印消息时自动添加时间        public static bool AutoTime = true;        public static void AppendMsg(this RichTextBox richTextBox1, Color color, string text)        {            richTextBox1.BeginInvoke(new ThreadStart(() =>            {                lock (richTextBox1)                {                    //为控件输入焦点                    richTextBox1.Focus();                    //检查文本框过长                    if (richTextBox1.TextLength > 10000)                    {                        richTextBox1.Clear();                    }                    //得到有格式的文本                     using (var temp = new RichTextBox())                    {                        temp.SelectionColor = color;                        if (AutoTime)                            temp.AppendText(DateTime.Now.ToString("HH:mm:ss   "));                        temp.AppendText(text);                        //追加文本                        richTextBox1.Select(richTextBox1.Rtf.Length, 0);                        richTextBox1.SelectedRtf = temp.Rtf;                    }                    //设定光标所在位置                     //richTextBox1.SelectionStart = richTextBox1.TextLength;                    //滚动到当前光标处                     //richTextBox1.ScrollToCaret();                }            }));        }        public static void Error(this RichTextBox richTextBox1, string text)        {            richTextBox1.AppendMsg(Color.Red, text);        }        public static void Warn(this RichTextBox richTextBox1, string text)        {            richTextBox1.AppendMsg(Color.Violet, text);        }        public static void Info(this RichTextBox richTextBox1, string text)        {            richTextBox1.AppendMsg(Color.Green, text);        }    }
RichtextboxExt

问题

  在以上代码中,其实是构造了局部的RichTextBox,将要显示的效果先设置在该临时控件上,然后直接把带格式的字体设置到原来的控件中。之所这样绕了一圈,是因为如果直接在原来的控件上(richTextBox1)上操作,会带来问题,这个问题则是后台线程在打印消息时,点击richTextBox1输入框,会将文字格式变成原有的黑色。

  下面列举其他的2种实现方法:

public void AppendMsg(Color color, string text)        {            lock (richTextBox1)            {                richTextBox1.AppendText(string.Empty);                richTextBox1.SelectionColor = color;                richTextBox1.AppendText(DateTime.Now.ToString("HH:mm:ss   "));                richTextBox1.AppendText(text);                richTextBox1.AppendText("\n");                //设定光标所在位置                 richTextBox1.SelectionStart = richTextBox1.TextLength;                //滚动到当前光标处                 richTextBox1.ScrollToCaret();            }        }
实现一
public void AppendMsg2(Color color, string text)        {            lock (richTextBox1)            {                int p1 = richTextBox1.TextLength;  //取出未添加时的字符串长度。                    richTextBox1.AppendText(text + "/n");  //保留每行的所有颜色。 //  rtb.Text += strInput + "/n";  //添加时,仅当前行有颜色。                    int p2 = text.Length;  //取出要添加的文本的长度                    richTextBox1.Select(p1, p2);        //选中要添加的文本                    richTextBox1.SelectionColor = color;  //设置要添加的文本的字体色                }        }
实现二

  方法一是追加空字符串,然后设置格式,接着追加需要显示的文字,和操作Word一样,格式自动与前面保持一致、

  方法二则是记录新加的文本的位置,然后将其选中,接着设置选中文本的颜色。

  这2种方法,在点击控件的时候,均会带来之前提到的问题,文字变成黑色。当然,如果控件的Enable属性为false时,自然是可以避免的。所以折衷下来,使用了上述方案。

  我做Winform,纯属兴趣爱好,言辞不当望海涵。不知道大家有没有更好的实现方案,欢迎赐教。谢谢。

转载于:https://www.cnblogs.com/codealone/p/3231881.html

你可能感兴趣的文章
将16进制的颜色转为rgb颜色
查看>>
POJ 2182 Lost Cows (树状数组 && 二分查找)
查看>>
Matlab中界面和注释---中英文切换问题
查看>>
主板维修技术
查看>>
PHP实现四种基本排序算法
查看>>
企业级应用,如何实现服务化四(基础环境准备)
查看>>
Code::Blocks
查看>>
CBitmap,HBitmap,Bitmap区别及联系
查看>>
debian 系统备份
查看>>
netsh
查看>>
LabView 快捷键
查看>>
给自定义控件添加属性
查看>>
分层测试_经验分享
查看>>
Kendo UI - Class 基类定义
查看>>
算法导论Ch4
查看>>
jmeter的使用---用户变量
查看>>
三层的中间层,
查看>>
1. EasyUI 学习总结(一)——对话框dialog
查看>>
Java play freamwork 新闻通知的定时发送
查看>>
iOS app 的 ASLR
查看>>