本文利用一个简单的小例子【文本编辑器】,讲解RichTextBox的用法,仅供学习分享使用,如有不足之处,还请指正。

Windows窗体中的RichTextBox控件用于显示,输入和操作格式化的文本,RichTextBox除了拥有TextBox控件的所有功能外,还可以显示字体,颜色,链接,从文件中读取和加载图像,以及查找指定的字符。RichTextBox控件通常用于提供类似字体处理程序(如Microsoft Word)的文本操作和显示功能。RichTextBox控件可以显示滚动条,且默认根据需要进行显示。

涉及知识点:

  • SelectionFont 获取或设置当前选定文本或插入点的字体。
  • FontStyle 指定应用到文本的字形信息。
  • SelectionAlignment  获取或设置应用到当前选定内容或插入点的对齐方式。
  • SelectionIndent 获取或设置所选内容开始行的缩进距离(以像素为单位)。
  • SelectionCharOffset 获取或设置控件中的文本是显示在基线上、作为上标还是作为基线下方的下标。
  • SelectionColor 获取或设置当前选定文本或插入点的文本颜色。
  • SelectionBackColor   获取或设置在 System.Windows.Forms.RichTextBox 控件中选中文本时文本的颜色。
  • SelectionBullet 获取或设置一个值,通过该值指示项目符号样式是否应用到当前选定内容或插入点。
  • Clipboard Paste 粘贴指定剪贴板格式的剪贴板内容【插入图片时使用】。
  • Find 在对搜索应用特定选项的情况下,在 System.Windows.Forms.RichTextBox 控件的文本中搜索位于控件内特定位置的字符串。

效果图

如下【以下设置文本对应的格式】:

核心代码

如下

 using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace DemoRichText.Model
{
public class DefaultRickFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{ }
} /// <summary>
/// 加粗格式
/// </summary>
public class BoldRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Bold)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Bold);//支持位于运算
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Bold);
}
rtbInfo.SelectionFont = newFont;
}
} /// <summary>
/// 斜体
/// </summary>
public class ItalicRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Italic)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Italic);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Italic);
}
rtbInfo.SelectionFont = newFont;
rtbInfo.Focus();
}
} /// <summary>
/// 下划线
/// </summary>
public class UnderLineRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Underline)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Underline);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Underline);
}
rtbInfo.SelectionFont = newFont;
rtbInfo.Focus();
}
} /// <summary>
/// 删除线
/// </summary>
public class StrikeLineRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Underline)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Strikeout);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Strikeout);
}
rtbInfo.SelectionFont = newFont;
rtbInfo.Focus();
}
} /// <summary>
/// 左对齐
/// </summary>
public class LeftRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
rtbInfo.Focus();
}
} /// <summary>
/// 居中对齐
/// </summary>
public class CenterRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionAlignment == HorizontalAlignment.Center)
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
}
else
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Center;
} rtbInfo.Focus();
}
} /// <summary>
/// 右对齐
/// </summary>
public class RightRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionAlignment == HorizontalAlignment.Right)
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
}
else
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Right;
} rtbInfo.Focus();
}
} /// <summary>
/// 缩进对齐
/// </summary>
public class IndentRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
//每次以10个像素进行缩进
rtbInfo.SelectionIndent = rtbInfo.SelectionIndent + ;
rtbInfo.Focus();
}
} /// <summary>
/// 缩进对齐
/// </summary>
public class OutIndentRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
//每次以10个像素进行缩进
rtbInfo.SelectionIndent = rtbInfo.SelectionIndent - ;
rtbInfo.Focus();
}
} /// <summary>
/// 下标
/// </summary>
public class SubScriptRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionCharOffset < )
{
rtbInfo.SelectionCharOffset = ;
}
else {
rtbInfo.SelectionCharOffset = -;
}
rtbInfo.Focus();
}
} /// <summary>
/// 上标
/// </summary>
public class SuperScriptRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionCharOffset > )
{
rtbInfo.SelectionCharOffset = ;
}
else {
rtbInfo.SelectionCharOffset = ;
}
rtbInfo.Focus();
}
} /// <summary>
/// 字体
/// </summary>
public class FontRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
FontDialog f = new FontDialog();
if (f.ShowDialog() == DialogResult.OK)
{
FontFamily family = f.Font.FontFamily;
rtbInfo.SelectionFont = new Font(family, rtbInfo.SelectionFont.Size, rtbInfo.SelectionFont.Style);
}
rtbInfo.Focus();
}
} /// <summary>
/// 文本颜色
/// </summary>
public class ForeColorRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
ColorDialog f = new ColorDialog();
if (f.ShowDialog() == DialogResult.OK)
{ rtbInfo.SelectionColor = f.Color;
}
rtbInfo.Focus();
}
} /// <summary>
/// 文本背景颜色
/// </summary>
public class BgColorRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
ColorDialog f = new ColorDialog();
if (f.ShowDialog() == DialogResult.OK)
{ rtbInfo.SelectionBackColor = f.Color;
}
rtbInfo.Focus();
}
} /// <summary>
/// UL列表,项目符号样式
/// </summary>
public class UlRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionBullet)
{
rtbInfo.SelectionBullet = false;
}
else {
rtbInfo.SelectionBullet = true;
rtbInfo.BulletIndent = ;
}
rtbInfo.Focus();
}
} /// <summary>
/// 图片插入
/// </summary>
public class PicRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
OpenFileDialog o = new OpenFileDialog();
o.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
o.Title = "请选择图片";
o.Filter = "jpeg|*.jpeg|jpg|*.jpg|png|*.png|gif|*.gif";
if (o.ShowDialog() == DialogResult.OK) {
string fileName = o.FileName;
try
{
Image bmp = Image.FromFile(fileName);
Clipboard.SetDataObject(bmp); DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap);
if (rtbInfo.CanPaste(dataFormat))
{
rtbInfo.Paste(dataFormat);
} }
catch (Exception exc)
{
MessageBox.Show("图片插入失败。" + exc.Message, "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
} }
rtbInfo.Focus();
}
} /// <summary>
/// 删除
/// </summary>
public class DelRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
rtbInfo.SelectedText = "";
rtbInfo.Focus();
}
} /// <summary>
/// 查找
/// </summary>
public class SearchRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
string find = rtbInfo.Tag.ToString();
int index= rtbInfo.Find(find, ,RichTextBoxFinds.None);
int startPos = index;
int nextIndex = ;
while (nextIndex != startPos)//循环查找字符串,并用蓝色加粗12号Times New Roman标记之
{
rtbInfo.SelectionStart = index;
rtbInfo.SelectionLength = find.Length;
rtbInfo.SelectionColor = Color.Blue;
rtbInfo.SelectionFont = new Font("Times New Roman", (float), FontStyle.Bold);
rtbInfo.Focus();
nextIndex = rtbInfo.Find(find, index + find.Length, RichTextBoxFinds.None);
if (nextIndex == -)//若查到文件末尾,则充值nextIndex为初始位置的值,使其达到初始位置,顺利结束循环,否则会有异常。
{
nextIndex = startPos;
}
index = nextIndex;
}
rtbInfo.Focus();
}
} /// <summary>
/// 打印
/// </summary>
public class PrintRichFormat : BaseRichFormat
{
private RichTextBox richTextbox; public override void SetFormat(RichTextBox rtbInfo)
{
this.richTextbox = rtbInfo;
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
// 打印文档
pd.Print();
} private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
//ev.Graphics.DrawString(richTextbox.Text);
//ev.HasMorePages = true;
}
} /// <summary>
/// 字体大小
/// </summary>
public class FontSizeRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
string fontSize = rtbInfo.Tag.ToString();
float fsize = 0.0f;
if (float.TryParse(fontSize, out fsize)) {
rtbInfo.SelectionFont = new Font(rtbInfo.Font.FontFamily, fsize, rtbInfo.SelectionFont.Style);
}
rtbInfo.Focus();
}
}
}

页面代码【由于实现了代码封装,所有页面代码较少】

 using DemoRichText.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace DemoRichText
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
} public void btnButtonClick(object sender, EventArgs e) {
Button btn = (Button)sender;
BTNType btnType;
if (Enum.TryParse<BTNType>(btn.Tag.ToString(), out btnType)) {
if (btnType == BTNType.Search) {
if (!string.IsNullOrEmpty(this.txtSearch.Text.Trim()))
{
this.rtbInfo.Tag = this.txtSearch.Text.Trim();
}
else {
return;
} }
IRichFormat richFomat = RichFormatFactory.CreateRichFormat(btnType);
richFomat.SetFormat(this.rtbInfo);
}
} private void combFontSize_SelectedIndexChanged(object sender, EventArgs e)
{
float fsize = 12.0f;
if (combFontSize.SelectedIndex > -) {
if (float.TryParse(combFontSize.SelectedItem.ToString(), out fsize)) {
rtbInfo.Tag = fsize.ToString();
IRichFormat richFomat = RichFormatFactory.CreateRichFormat(BTNType.FontSize);
richFomat.SetFormat(this.rtbInfo);
}
return;
}
}
}
}

RichTextBox是一个功能丰富的控件,值得学习。

源码下载链接

源码链接

C# RichTextBox 制作文本编辑器的更多相关文章

  1. ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能

    本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...

  2. wpf 富文本编辑器richtextbox的简单用法

    最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单. richtextbox 类似于Word,是一个可编辑的控件.结构 ...

  3. html里文本编辑器如何制作呢?

    初入it职场,文本编辑器真的让人捉摸不透.最终在前端姐姐帮助下弄好了↓ 先在头部写好编辑器的各种功能的总体模型 <script>var editor; KindEditor.ready(f ...

  4. [前端随笔][JavaScript] 制作一个富文本编辑器

    写在前面 现在网上有很多现成的富文本编辑器,比如百度家的UEditor,kindeditor,niceditor等等,功能特别的多,API也很多,要去熟悉他的规则也很麻烦,所以想自己了解一下原理,做一 ...

  5. Bzoj1269 [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3678  Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可正 ...

  6. 强大好用的"文本"编辑器

    1 editplugs 说明:EditPlus是一款由韩国 Sangil Kim (ES-Computing)出品的小巧但是功能强大的可处理文本.HTML和程序语言的Windows编辑器,你甚至可以通 ...

  7. 重构wangEditor(web富文本编辑器),欢迎指正!

    提示:最新版wangEditor请参见:wangEditor.github.io 或者 https://github.com/wangfupeng1988/wangEditor 1. 前言 (下载源码 ...

  8. 【BZOJ】1269: [AHOI2006]文本编辑器editor(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1269 这题RE2次啊,好不爽啊,我一直以为是splay的问题,其实是数组开小了......(我老犯这 ...

  9. editplus文本编辑器

    EditPlus中文破解版是一款功能强大的文本编辑器,拥有无限制的撤消与重做.英文拼字检查.自动换行.列数标记.搜寻取代.同时编辑多文件.全屏幕浏览功能.还有一个好用的功能,就是它有监视剪贴板的功能, ...

随机推荐

  1. Ubuntu双网卡设置内外网上网的问题

    UBUNTU16.04系统,双网卡:eth0, eth1.分贝设置成Public IP, 和局域网IP, 这样这台计算机就可以访问局域网内的各个IP, 同时还可以在全球各地被访问,使用ssh or r ...

  2. onload事件与ready事件的区别,原生js与jquery的区别

    onload事件与ready事件分别是原生js与jquery的入口函数 原生js入口函数写法: window.onload=function(){ } jquery入口函数写法: $(document ...

  3. python(leetcode)-48旋转图像

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  4. [MongoDB]Mongo基本使用

    [MongoDB]Mongo基本使用:   汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库 ...

  5. Prometheus 入门与实践

    原文链接:https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practi ...

  6. mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)

    一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...

  7. oracle12c创建用户提示ORA-65096:公用用户名或角色无效

    1.背景 以前一直用的是oracle11g,创建用户一直没有问题, 今天在oracle12c上创建用户,报错了.如下图: 我很郁闷, 就打开了oracle官方网站找了下, 发现创建用户是有限制的. 2 ...

  8. yum源配置

    我这里使用的centos7操作系统. 下载地址是:https://www.centos.org/download/ yum仓库的创建可以参考: http://www.cnblogs.com/zhaoj ...

  9. javascript小实例,在页面中输出当前客户端时间

    时间对象(Date())比较简单,本文旨在为初学者入门使用,大牛可略过! 本文承接基础知识实例,说一下实例的要求: 在页面中输出当前客户端时间(2015年1月1日星期一10:10:10这样的格式),每 ...

  10. C#集合。

    集合命名空间: using system.collections. 非泛型集合 using system.collections.Generic.  泛型集合 为什么要用集合: 1.数组一旦声明长度就 ...