WinForm真入门(9)——RichTextBox控件详解

WinForm中RichTextBox控件详解:从基础到高级应用

上一文中笔者重点介绍了TextBox控件的详细用法,忘记的 请点击WinForm真入门(8)——TextBox控件详解,那么本文中的RichTextBox与TextBox有什么区别吗,光看名字的话,多了一个“Rich 富有的意思”,是不是暗示着它支持的功能更多呢?没错,RichTextBox是WinForm中功能强大的富文本编辑控件,支持字体、颜色、段落格式、图像嵌入、超链接等复杂功能。以下从基础到高级功能全面解析,并提供多个实用案例。


一、基础属性与核心功能‌

‌1、基础属性‌

  • Text‌:获取或设置纯文本内容。
richTextBox1.Text = "Hello World";
  • ‌Rtf‌:获取或设置带格式的RTF内容。
richTextBox1.Rtf = @"{\rtf1\ansi 这是\b 加粗\b0 的文本}";
  • ‌SelectionFont‌:设置选中文本的字体样式。
richTextBox1.SelectionFont = new Font("Arial", 12, FontStyle.Bold);
  • ‌SelectionColor‌:设置选中文本的颜色。
richTextBox1.SelectionColor = Color.Red;
  • ‌SelectionAlignment‌:设置段落对齐方式(左对齐、居中、右对齐)。
richTextBox1.SelectionAlignment = HorizontalAlignment.Center;

2‌、常用方法‌

  • ‌AppendText‌:追加文本(保留当前格式)。
richTextBox1.AppendText("\n新的一行");
  • ‌LoadFile/SaveFile‌:加载或保存RTF文件。
richTextBox1.LoadFile("document.rtf");
richTextBox1.SaveFile("document.rtf", RichTextBoxStreamType.RichText);
  • ‌Find‌:查找文本。
int index = richTextBox1.Find("关键字");
if (index >= 0) richTextBox1.Select(index, "关键字".Length);

3‌、关键事件‌

  • ‌TextChanged‌:文本内容变化时触发。
private void richTextBox1_TextChanged(object sender, EventArgs e) { }
  • ‌SelectionChanged‌:选中文本范围变化时触发。
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{label1.Text = $"当前选中:{richTextBox1.SelectionLength}字符";
}

‌二、高级功能与案例‌

‌案例1:实现富文本编辑器‌

// 字体选择
private void btnFont_Click(object sender, EventArgs e)
{FontDialog fontDialog = new FontDialog();if (fontDialog.ShowDialog() == DialogResult.OK){richTextBox1.SelectionFont = fontDialog.Font;}
}// 颜色选择
private void btnColor_Click(object sender, EventArgs e)
{ColorDialog colorDialog = new ColorDialog();if (colorDialog.ShowDialog() == DialogResult.OK){richTextBox1.SelectionColor = colorDialog.Color;}
}// 插入图片(通过剪贴板)
private void btnInsertImage_Click(object sender, EventArgs e)
{OpenFileDialog openFile = new OpenFileDialog();openFile.Filter = "图片文件|*.jpg;*.png;*.bmp";if (openFile.ShowDialog() == DialogResult.OK){Clipboard.SetImage(Image.FromFile(openFile.FileName));richTextBox1.Paste();}
}

‌案例2:动态设置段落缩进与项目符号‌

// 增加缩进
private void btnIndent_Click(object sender, EventArgs e)
{richTextBox1.SelectionIndent += 20;
}// 添加项目符号
private void btnBullet_Click(object sender, EventArgs e)
{richTextBox1.SelectionBullet = true;richTextBox1.AppendText("项目1\n项目2\n");
}

‌案例3:实现超链接与点击事件‌

// 插入超链接
private void InsertHyperlink(string text, string url)
{richTextBox1.SelectionColor = Color.Blue;richTextBox1.SelectionFont = new Font("Arial", 10, FontStyle.Underline);richTextBox1.AppendText(text);richTextBox1.SelectionStart = richTextBox1.Text.Length - text.Length;richTextBox1.SelectionLength = text.Length;richTextBox1.SelectionLink = true;// 存储URL到TagrichTextBox1.Tag = url;
}// 处理超链接点击
private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{System.Diagnostics.Process.Start(e.LinkText);
}

‌案例4:日志显示(不同颜色区分信息类型)‌

public void LogMessage(string message, LogLevel level)
{Color color = Color.Black;switch (level){case LogLevel.Info: color = Color.Blue; break;case LogLevel.Warn: color = Color.Orange; break;case LogLevel.Error: color = Color.Red; break;}richTextBox1.SelectionColor = color;richTextBox1.AppendText($"{DateTime.Now}: {message}\n");richTextBox1.ScrollToCaret(); // 自动滚动到底部
}

‌案例5:实现撤销(Undo)与重做(Redo)‌

private void btnUndo_Click(object sender, EventArgs e)
{if (richTextBox1.CanUndo){richTextBox1.Undo();richTextBox1.ClearUndo(); // 防止重复撤销}
}private void btnRedo_Click(object sender, EventArgs e)
{// 需自行维护重做栈(RichTextBox无原生Redo方法)// 可通过继承控件或记录操作历史实现
}

‌三、性能优化与高级技巧‌

1‌、大量文本处理优化‌

  • 挂起绘制‌:在批量操作时暂停绘制以提升性能。
SendMessage(richTextBox1.Handle, WM_SETREDRAW, false, 0);
// 执行批量文本操作...
SendMessage(richTextBox1.Handle, WM_SETREDRAW, true, 0);
richTextBox1.Invalidate();

2‌、防闪烁处理‌

  • ‌自定义控件启用双缓冲‌:
public class NoFlickerRichTextBox : RichTextBox
{public NoFlickerRichTextBox(){SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);}
}

3‌、异步加载内容‌

  • 使用Task避免界面卡顿:
private async void LoadLargeFile(string path)
{string rtfContent = await Task.Run(() => File.ReadAllText(path));richTextBox1.Rtf = rtfContent;
}

‌四、与其他控件交互‌

‌案例6:与TreeView联动实现大纲视图‌

// 根据标题生成目录
private void GenerateOutline()
{treeView1.Nodes.Clear();foreach (string line in richTextBox1.Lines){if (line.StartsWith("# ")){TreeNode node = new TreeNode(line.Substring(2));treeView1.Nodes.Add(node);}}
}// 点击目录跳转到对应位置
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{int index = richTextBox1.Find(e.Node.Text);if (index != -1){richTextBox1.SelectionStart = index;richTextBox1.ScrollToCaret();}
}

‌案例7:与WebBrowser控件协同显示HTML‌

// 将RTF转换为HTML显示(需第三方库如PanGu.RTF)
private void btnPreviewHtml_Click(object sender, EventArgs e)
{string html = ConvertRtfToHtml(richTextBox1.Rtf);webBrowser1.DocumentText = html;
}

‌五、数据持久化与扩展‌

1‌、保存与加载格式‌

  • RTF格式‌:保留所有样式。
richTextBox1.SaveFile("doc.rtf", RichTextBoxStreamType.RichText);
  • ‌纯文本格式‌:仅保留文本内容。
File.WriteAllText("doc.txt", richTextBox1.Text);

2‌、扩展:实现Markdown编辑器‌

  • 使用正则表达式转换Markdown与RTF:
// 转换加粗语法:‌**text**‌ → \b text\b0
string rtf = Regex.Replace(markdown, @"\*\*(.*?)\*\*", @"\b $1\b0");

‌六、常见问题与解决方案‌

‌1、图片显示不全‌

  • 原因:图片过大导致布局溢出。
  • 解决:缩放图片至合适尺寸后再插入。
Image img = Image.FromFile("large.jpg");
Bitmap resized = new Bitmap(img, new Size(200, 200));
Clipboard.SetImage(resized);
richTextBox1.Paste();

2‌、跨平台格式兼容性‌

  • 问题:在不同系统上RTF渲染不一致。
  • 解决:尽量使用通用字体(如Arial、Times New Roman)。

3‌、超链接无法点击‌

  • 检查:确保DetectUrls属性为true,并处理LinkClicked事件。
richTextBox1.DetectUrls = true;

七、使用建议

1‌、核心场景‌:

  • 需要富文本编辑(如邮件客户端、文档编辑器)。
  • 动态显示格式化的日志或聊天记录。
  • 复杂报表的内容生成与预览。

2‌、避坑指南‌:

  • 避免直接操作Rtf属性拼接复杂格式,优先使用SelectionXXX方法。
  • 处理大量文本时,务必使用挂起绘制技术提升性能。
  • 谨慎使用剪贴板操作,需处理权限和异常。

通过灵活运用RichTextBox的丰富功能,结合WinForm的事件驱动模型,可构建高度定制化的富文本处理应用。功能比较多,如果是初学者,可以先了解一下,会使用即可。如果对你有所帮助的话,欢迎点赞,收藏,加关注,以防后期找不到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Draw.io 全面解析与竞品分析:图表绘制工具的深度对比

目录 一、Draw.io 全面介绍 1. 产品概述 2. 核心功能特点 3. 用户体验 4. 商业模式 二、市场竞品分析 1. 主要竞品概览 2. 深度功能对比 3. 价格策略对比 4. 技术架构对比 三、用户场景与选择建议 1. 不同场景下的工具推荐 2. 未来发展趋势 四、结论 diagrams.net…

kafka分区策略详解

Kafka 分区策略详解 Kafka 的分区策略决定了消息在生产者端如何分配到不同分区,以及在消费者端如何动态分配分区以实现负载均衡。以下是 Kafka 核心分区策略及其适用场景的详细解析: 1、生产者分区策略 生产者负责将消息发送到 Topic 的特定分区&#…

C++ STL 详解 ——list 的深度解析与实践指南

在 C 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码…

GenerationMixin概述

类 类名简单说明GenerateDecoderOnlyOutput继承自 ModelOutput,适用于非束搜索方法的解码器-only模型输出类。GenerateEncoderDecoderOutput继承自 ModelOutput,适用于非束搜索方法的编码器-解码器模型输出类。GenerateBeamDecoderOnlyOutput继承自 Mod…

【备赛】蓝桥杯嵌入式实现led闪烁

原理 由于蓝桥杯的板子带有锁存器,并且与lcd屏幕有冲突,所以这个就成了考点。 主要就是用定时器来实现,同时也要兼顾lcd的冲突。 一、处理LCD函数 首先来解决与lcd屏幕冲突的问题,把我们所有用到的lcd函数改装一下。 以下是基…

C++ 并发性能优化实战:提升多线程应用的效率与稳定性

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术&#xff0c…

Python----计算机视觉处理(Opencv:道路检测之车道线拟合)

完整版: Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示) 一、获取左右车道线的原始位置 导入模块 import cv2 import numpy as np from matplot…

优选算法的妙思之流:分治——归并专题

专栏:算法的魔法世界 个人主页:手握风云 目录 一、归并排序 二、例题讲解 2.1. 排序数组 2.2. 交易逆序对的总数 2.3. 计算右侧小于当前元素的个数 2.4. 翻转对 一、归并排序 归并排序也是采用了分治的思想,将数组划分为多个长度为1的子…

C语言查漏补缺:基础篇

1.原理 C语言是一门编译型计算机语言,要编写C代码,C源代码文本文件本身无法直接执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,然后才能执行。这里的二进制的可执行文件就是我们最终要形成的可执行程…

TPS入门DAY02 服务器篇

1.创建空白插件 2.导入在线子系统以及在线steam子系统库 MultiplayerSessions.uplugin MultiplayerSessions.Build.cs 3.创建游戏实例以及初始化会话创建流程 创建会话需要的函数,委托,委托绑定的回调,在线子系统接口绑定某一个委托的控制其…

产品经理课程

原型工具 一、土耳其机器人 这个说法来源于 1770 年出现的一个骗局,一个叫沃尔夫冈冯肯佩伦(Wolfgang von Kempelen)的人为了取悦奥地利女皇玛丽娅特蕾莎(Maria Theresia),“制造”了一个会下国际象棋的机…

nginx中的limit_req 和 limit_conn

在 Nginx 中,limit_req 和 limit_conn 是两个用于限制客户端请求的指令,它们分别用于限制请求速率和并发连接数。 limit_req limit_req 用于限制请求速率,防止客户端发送过多请求影响服务器性能。它通过 limit_req_zone 指令定义一个共享内存…

基于winform的串口调试助手

目录 一、串口助手界面设计 1.1 串口配置 1.2 接收配置 1.3 发送配置 1.4 接收窗口和发送窗口 1.5 状态显示窗口 1.6 串口通讯控件 二、程序编写 2.1 端口号自动识别并显示在端口号下拉框 功能说明: 2.2 波特率下拉框显示 2.3 数据位下拉框显示 2.4 校…

Docker基础2

如需转载,标记出处 本次我们将下载一个 Docker 镜像,从镜像中启动容器 上一章,安装 Docker 时,获得两个主要组件: Docker 客户端 Docker 守护进程(有时称为“服务器”或“引擎”) 守护进程实…

Rocketmq2

一、生产者端防丢失 1. 发送方式选择 同步发送:使用 send() 方法,等待 Broker 确认响应(SendResult),确保消息已成功发送。异步发送:使用 sendAsync() 方法并设置回调函数,处理发送成功 / 失败…

RabbitMQ详解,RabbitMQ是什么?架构是怎样的?

目录 一,RabbitMQ是什么? 二,RabbitMQ架构 2.1 首先我们来看下RabbitMQ里面的心概念Queue是什么? 2.2 交换器Exchange 2.3 RabbitMQ是什么? 2.4 重点看下优先级队列是什么? 三,RabbitMQ集群 3.1 普通集群模式 3.2 镜像队列集群 一,RabbitMQ是什么? 假设我们程序…

【一步步开发AI运动APP】六、运动计时计数能调用

之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今…

MySQL——DQL的多表查询

一、交叉连接 标准语法:select * from 表1 cross join 表2 where 表1.公共列 表2.公共列; 简单语法:select * from 表1 , 表2 where 表1.公共列 表2.公共列; 公共列:两张表具有相同含义的列,不是列名一样。 …

【Linux内核】如何更加优雅阅读Linux内核源码(vscode)

1. 前言 因为已经习惯在Ubuntu下进行嵌入式工作开发,但Linux源码在Source Insight下进行阅读,一直很苦恼Linux/Windows来回切换的开发方式,当前发现可以通过 vscode clangd(扩展组件) 方式进行更好的内核源码阅读。 2. 环境 操作系统&…

21.OpenCV获取图像轮廓信息

OpenCV获取图像轮廓信息 在计算机视觉领域,识别和分析图像中的对象形状是一项基本任务。OpenCV 库提供了一个强大的工具——轮廓检测(Contour Detection),它能够帮助我们精确地定位对象的边界。这篇博文将带你入门 OpenCV 的轮廓…