背景

  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 > )
{
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, );
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 > )
{
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, );
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,纯属兴趣爱好,言辞不当望海涵。不知道大家有没有更好的实现方案,欢迎赐教。谢谢。

厌倦了ListBox打印消息,使用RichTextBox试试吧的更多相关文章

  1. 在Android.mk文件中输出打印消息

    http://www.xuebuyuan.com/1947880.html 在进行Android NDK的开发当中有时想看看Android.mk文件当中某个变量的值,可以再Android.mk文件当中 ...

  2. 在Android.mk文件中输出打印消息 (转载)

    转自:http://blog.csdn.net/xiaibiancheng/article/details/8479694 在进行Android NDK的开发当中有时想看看Android.mk文件当中 ...

  3. IDEA UI版本取消Output窗口打印消息的条数的限制

    打开IDEA的安装目录-->进入bin文件夹-->编辑idea.properties文件::修改idea.cycle.buffer.size=1024为idea.cycle.buffer. ...

  4. console 打印消息时,可以使用 %c 指定随后的文本样式; %s 可引用参数变量。

    1.console.log 使用 加%c console.log('%c Merry Christmas!!', 'color:green;background:yellow;text-shadow: ...

  5. HOW TO:使用 Visual C# .NET 打印 RichTextBox 控件的内容

    概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任何打印 RichTextBox 内容的方法.您可以扩展 RichTextBox 类以使用 EM ...

  6. C#如何打印RichTextBox控件的内容

      本任务的内容 摘要 创建 RichTextBoxPrintCtrl 控件 测试控件 参考 概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任 ...

  7. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  8. 消息队列通信,王明学learn

    消息队列通信 消息队列就是一个消息(一个结构)的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以从中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息. 每一个消息都是一个结构体 ...

  9. java微信接口之五—消息分组群发

    一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...

随机推荐

  1. 最小生成数kruskal算法和prim算法

    定义 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图. 连通网:在 ...

  2. 財務会計管理(FI&CO)

    FI(財務会計)系のSAP DBテーブル.随時更新していきます. [勘定コードマスタ]SKA1: 勘定コードマスタ(勘定コード表データ)SKB1: 勘定コードマスタ(会社コードデータ)SKAT: テキ ...

  3. 20145202马超 《Java程序设计》第六周学习总结

    进程:是一个正在执行中的程序,每一个进程都有一个执行程序,该顺序是一个执行路径,或者说是一个控制单元. 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行. 一个进程至少有一线程. Java ...

  4. android studio 首字母提示 设置 大小写敏感

    在使用Android studo 编写程序时, 刚开始,关键字提示 首字母 设置了 大小写敏感,小写字母只能提示小写字母开头的,大写字母只能提示大写字母开始的,比较麻烦,在网上搜了下,解决办法如下: ...

  5. Centos7 grep命令简介

    grep 是一个最初用于 Unix 操作系统的命令行工具.在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本. grep 可根据提供的 ...

  6. Eclipse 菜单---Eclipse教程第04课

    Eclipse 查看的菜单栏通常包含以下几个菜单: File 菜单 Edit 菜单 Navigate 菜单 Search 菜单 Project 菜单 Run 菜单 Window 菜单 Help 菜单 ...

  7. laravel5.5事件广播系统实例laravel-echo + redis + socket.io

    目录 1. 广播配置说明 1.1 广播驱动配置 1.2 注册服务提供器 2. 驱动器配置 2.1 安装predis 2.2. 配置服务端 2.2.1 安装方法 2.2.2 初始化服务端 2.2.3 运 ...

  8. Python3的unittest用例按编写顺序执行

    unittest是Python标准库自带的单元测试框架,是Python版本的JUnit,关于unittest框架的使用,官方文档非常详细,网上也有不少好的教程,这里就不多说了. 本文主要分享在使用un ...

  9. vue常用片段

    事件处理 基本骨架 子组件 axios v-if v-for 路由 设置style 计算属性 动态class 路由跳转 store nextTick 事件处理: 直接写表达式:   @click=&q ...

  10. Python全栈工程师(集合、函数)

     ParisGabriel     感谢 大家的支持  你们的阅读评价就是我最好的动力  我会坚持把排版内容以及偶尔的错误做的越来越好        每天坚持 一天一篇 点个订阅吧  灰常感谢    ...