• 厌倦了ListBox打印消息,使用RichTextBox试试吧


    背景

      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("
    ");
                    //设定光标所在位置 
                    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,纯属兴趣爱好,言辞不当望海涵。不知道大家有没有更好的实现方案,欢迎赐教。谢谢。

  • 相关阅读:
    Object类的方法简记
    run()和start()调用问题简记
    面向对象设计
    关于JVM的简记
    操作运算符的简记
    jdbc简记
    synchronized的简记
    垃圾回收的一些简记
    java.io.IOException: Stream closed
    Java-文件名、目录名或卷标语法不正确
  • 原文地址:https://www.cnblogs.com/codealone/p/3231881.html
Copyright © 2020-2023  润新知