C# RichTextBox制作文本编辑器

 更新时间:2020年6月25日 11:20  点击:2355

本文利用一个简单的小例子【文本编辑器】,讲解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 + 10;
   rtbInfo.Focus();
  }
 }

 /// <summary>
 /// 缩进对齐
 /// </summary>
 public class OutIndentRichFormat : BaseRichFormat
 {
  public override void SetFormat(RichTextBox rtbInfo)
  {
   //每次以10个像素进行缩进
   rtbInfo.SelectionIndent = rtbInfo.SelectionIndent - 10;
   rtbInfo.Focus();
  }
 }

 /// <summary>
 /// 下标
 /// </summary>
 public class SubScriptRichFormat : BaseRichFormat
 {
  public override void SetFormat(RichTextBox rtbInfo)
  {
   if (rtbInfo.SelectionCharOffset < 0)
   {
    rtbInfo.SelectionCharOffset = 0;
   }
   else {
    rtbInfo.SelectionCharOffset = -5;
   }
   rtbInfo.Focus();
  }
 }

 /// <summary>
 /// 上标
 /// </summary>
 public class SuperScriptRichFormat : BaseRichFormat
 {
  public override void SetFormat(RichTextBox rtbInfo)
  {
   if (rtbInfo.SelectionCharOffset > 0)
   {
    rtbInfo.SelectionCharOffset = 0;
   }
   else {
    rtbInfo.SelectionCharOffset = 5;
   }
   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 = 10;
   }
   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, 0,RichTextBoxFinds.None);
   int startPos = index;
   int nextIndex = 0;
   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)12, FontStyle.Bold);
    rtbInfo.Focus();
    nextIndex = rtbInfo.Find(find, index + find.Length, RichTextBoxFinds.None);
    if (nextIndex == -1)//若查到文件末尾,则充值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 > -1) {
    if (float.TryParse(combFontSize.SelectedItem.ToString(), out fsize)) {
     rtbInfo.Tag = fsize.ToString();
     IRichFormat richFomat = RichFormatFactory.CreateRichFormat(BTNType.FontSize);
     richFomat.SetFormat(this.rtbInfo);
    }
    return;
   }
  }
 }
}

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

点击文末原文地址下载源码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25