C# RichTextBox 制作文本编辑器

本文利用一个简单的小例子【文本编辑器】,讲解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 控件的文本中搜索位于控件内特定位置的字符串。

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

核心代码如下

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Drawing;
  4 using System.Drawing.Printing;
  5 using System.Linq;
  6 using System.Text;
  7 using System.Threading.Tasks;
  8 using System.Windows.Forms;
  9
 10 namespace DemoRichText.Model
 11 {
 12     public class DefaultRickFormat : BaseRichFormat
 13     {
 14         public override void SetFormat(RichTextBox rtbInfo)
 15         {
 16
 17         }
 18     }
 19
 20     /// <summary>
 21     /// 加粗格式
 22     /// </summary>
 23     public class BoldRichFormat : BaseRichFormat
 24     {
 25         public override void SetFormat(RichTextBox rtbInfo)
 26         {
 27             Font oldFont = rtbInfo.SelectionFont;
 28             Font newFont;
 29             if (oldFont.Bold)
 30             {
 31                 newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Bold);//支持位于运算
 32             }
 33             else
 34             {
 35                 newFont = new Font(oldFont, oldFont.Style | FontStyle.Bold);
 36             }
 37             rtbInfo.SelectionFont = newFont;
 38         }
 39     }
 40
 41     /// <summary>
 42     /// 斜体
 43     /// </summary>
 44     public class ItalicRichFormat : BaseRichFormat
 45     {
 46         public override void SetFormat(RichTextBox rtbInfo)
 47         {
 48             Font oldFont = rtbInfo.SelectionFont;
 49             Font newFont;
 50             if (oldFont.Italic)
 51             {
 52                 newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Italic);
 53             }
 54             else
 55             {
 56                 newFont = new Font(oldFont, oldFont.Style | FontStyle.Italic);
 57             }
 58             rtbInfo.SelectionFont = newFont;
 59             rtbInfo.Focus();
 60         }
 61     }
 62
 63     /// <summary>
 64     /// 下划线
 65     /// </summary>
 66     public class UnderLineRichFormat : BaseRichFormat
 67     {
 68         public override void SetFormat(RichTextBox rtbInfo)
 69         {
 70             Font oldFont = rtbInfo.SelectionFont;
 71             Font newFont;
 72             if (oldFont.Underline)
 73             {
 74                 newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Underline);
 75             }
 76             else
 77             {
 78                 newFont = new Font(oldFont, oldFont.Style | FontStyle.Underline);
 79             }
 80             rtbInfo.SelectionFont = newFont;
 81             rtbInfo.Focus();
 82         }
 83     }
 84
 85     /// <summary>
 86     /// 删除线
 87     /// </summary>
 88     public class StrikeLineRichFormat : BaseRichFormat
 89     {
 90         public override void SetFormat(RichTextBox rtbInfo)
 91         {
 92             Font oldFont = rtbInfo.SelectionFont;
 93             Font newFont;
 94             if (oldFont.Underline)
 95             {
 96                 newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Strikeout);
 97             }
 98             else
 99             {
100                 newFont = new Font(oldFont, oldFont.Style | FontStyle.Strikeout);
101             }
102             rtbInfo.SelectionFont = newFont;
103             rtbInfo.Focus();
104         }
105     }
106
107     /// <summary>
108     /// 左对齐
109     /// </summary>
110     public class LeftRichFormat : BaseRichFormat
111     {
112         public override void SetFormat(RichTextBox rtbInfo)
113         {
114             rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
115             rtbInfo.Focus();
116         }
117     }
118
119     /// <summary>
120     /// 居中对齐
121     /// </summary>
122     public class CenterRichFormat : BaseRichFormat
123     {
124         public override void SetFormat(RichTextBox rtbInfo)
125         {
126             if (rtbInfo.SelectionAlignment == HorizontalAlignment.Center)
127             {
128                 rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
129             }
130             else
131             {
132                 rtbInfo.SelectionAlignment = HorizontalAlignment.Center;
133             }
134
135             rtbInfo.Focus();
136         }
137     }
138
139     /// <summary>
140     /// 右对齐
141     /// </summary>
142     public class RightRichFormat : BaseRichFormat
143     {
144         public override void SetFormat(RichTextBox rtbInfo)
145         {
146             if (rtbInfo.SelectionAlignment == HorizontalAlignment.Right)
147             {
148                 rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
149             }
150             else
151             {
152                 rtbInfo.SelectionAlignment = HorizontalAlignment.Right;
153             }
154
155             rtbInfo.Focus();
156         }
157     }
158
159     /// <summary>
160     /// 缩进对齐
161     /// </summary>
162     public class IndentRichFormat : BaseRichFormat
163     {
164         public override void SetFormat(RichTextBox rtbInfo)
165         {
166             //每次以10个像素进行缩进
167             rtbInfo.SelectionIndent = rtbInfo.SelectionIndent + 10;
168             rtbInfo.Focus();
169         }
170     }
171
172     /// <summary>
173     /// 缩进对齐
174     /// </summary>
175     public class OutIndentRichFormat : BaseRichFormat
176     {
177         public override void SetFormat(RichTextBox rtbInfo)
178         {
179             //每次以10个像素进行缩进
180             rtbInfo.SelectionIndent = rtbInfo.SelectionIndent - 10;
181             rtbInfo.Focus();
182         }
183     }
184
185     /// <summary>
186     /// 下标
187     /// </summary>
188     public class SubScriptRichFormat : BaseRichFormat
189     {
190         public override void SetFormat(RichTextBox rtbInfo)
191         {
192             if (rtbInfo.SelectionCharOffset < 0)
193             {
194                 rtbInfo.SelectionCharOffset = 0;
195             }
196             else {
197                 rtbInfo.SelectionCharOffset = -5;
198             }
199             rtbInfo.Focus();
200         }
201     }
202
203     /// <summary>
204     /// 上标
205     /// </summary>
206     public class SuperScriptRichFormat : BaseRichFormat
207     {
208         public override void SetFormat(RichTextBox rtbInfo)
209         {
210             if (rtbInfo.SelectionCharOffset > 0)
211             {
212                 rtbInfo.SelectionCharOffset = 0;
213             }
214             else {
215                 rtbInfo.SelectionCharOffset = 5;
216             }
217             rtbInfo.Focus();
218         }
219     }
220
221     /// <summary>
222     /// 字体
223     /// </summary>
224     public class FontRichFormat : BaseRichFormat
225     {
226         public override void SetFormat(RichTextBox rtbInfo)
227         {
228             FontDialog f = new FontDialog();
229             if (f.ShowDialog() == DialogResult.OK)
230             {
231                 FontFamily family = f.Font.FontFamily;
232                 rtbInfo.SelectionFont = new Font(family, rtbInfo.SelectionFont.Size, rtbInfo.SelectionFont.Style);
233             }
234             rtbInfo.Focus();
235         }
236     }
237
238     /// <summary>
239     /// 文本颜色
240     /// </summary>
241     public class ForeColorRichFormat : BaseRichFormat
242     {
243         public override void SetFormat(RichTextBox rtbInfo)
244         {
245             ColorDialog f = new ColorDialog();
246             if (f.ShowDialog() == DialogResult.OK)
247             {
248
249                 rtbInfo.SelectionColor = f.Color;
250             }
251             rtbInfo.Focus();
252         }
253     }
254
255     /// <summary>
256     /// 文本背景颜色
257     /// </summary>
258     public class BgColorRichFormat : BaseRichFormat
259     {
260         public override void SetFormat(RichTextBox rtbInfo)
261         {
262             ColorDialog f = new ColorDialog();
263             if (f.ShowDialog() == DialogResult.OK)
264             {
265
266                 rtbInfo.SelectionBackColor = f.Color;
267             }
268             rtbInfo.Focus();
269         }
270     }
271
272     /// <summary>
273     /// UL列表,项目符号样式
274     /// </summary>
275     public class UlRichFormat : BaseRichFormat
276     {
277         public override void SetFormat(RichTextBox rtbInfo)
278         {
279             if (rtbInfo.SelectionBullet)
280             {
281                 rtbInfo.SelectionBullet = false;
282             }
283             else {
284                 rtbInfo.SelectionBullet = true;
285                 rtbInfo.BulletIndent = 10;
286             }
287             rtbInfo.Focus();
288         }
289     }
290
291     /// <summary>
292     /// 图片插入
293     /// </summary>
294     public class PicRichFormat : BaseRichFormat
295     {
296         public override void SetFormat(RichTextBox rtbInfo)
297         {
298             OpenFileDialog o = new OpenFileDialog();
299             o.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
300             o.Title = "请选择图片";
301             o.Filter = "jpeg|*.jpeg|jpg|*.jpg|png|*.png|gif|*.gif";
302             if (o.ShowDialog() == DialogResult.OK) {
303                 string fileName = o.FileName;
304                 try
305                 {
306                    Image bmp = Image.FromFile(fileName);
307                    Clipboard.SetDataObject(bmp);
308
309                     DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap);
310                     if (rtbInfo.CanPaste(dataFormat))
311                     {
312                         rtbInfo.Paste(dataFormat);
313                     }
314
315                 }
316                 catch (Exception exc)
317                 {
318                     MessageBox.Show("图片插入失败。" + exc.Message, "提示",
319                                     MessageBoxButtons.OK, MessageBoxIcon.Information);
320                 }
321
322             }
323             rtbInfo.Focus();
324         }
325     }
326
327     /// <summary>
328     /// 删除
329     /// </summary>
330     public class DelRichFormat : BaseRichFormat
331     {
332         public override void SetFormat(RichTextBox rtbInfo)
333         {
334             rtbInfo.SelectedText = "";
335             rtbInfo.Focus();
336         }
337     }
338
339     /// <summary>
340     /// 查找
341     /// </summary>
342     public class SearchRichFormat : BaseRichFormat
343     {
344         public override void SetFormat(RichTextBox rtbInfo)
345         {
346             string find = rtbInfo.Tag.ToString();
347             int index=  rtbInfo.Find(find, 0,RichTextBoxFinds.None);
348             int startPos = index;
349             int nextIndex = 0;
350             while (nextIndex != startPos)//循环查找字符串,并用蓝色加粗12号Times New Roman标记之
351             {
352                 rtbInfo.SelectionStart = index;
353                 rtbInfo.SelectionLength = find.Length;
354                 rtbInfo.SelectionColor = Color.Blue;
355                 rtbInfo.SelectionFont = new Font("Times New Roman", (float)12, FontStyle.Bold);
356                 rtbInfo.Focus();
357                 nextIndex = rtbInfo.Find(find, index + find.Length, RichTextBoxFinds.None);
358                 if (nextIndex == -1)//若查到文件末尾,则充值nextIndex为初始位置的值,使其达到初始位置,顺利结束循环,否则会有异常。
359                 {
360                     nextIndex = startPos;
361                 }
362                 index = nextIndex;
363             }
364             rtbInfo.Focus();
365         }
366     }
367
368     /// <summary>
369     /// 打印
370     /// </summary>
371     public class PrintRichFormat : BaseRichFormat
372     {
373         private RichTextBox richTextbox;
374
375         public override void SetFormat(RichTextBox rtbInfo)
376         {
377             this.richTextbox = rtbInfo;
378             PrintDocument pd = new PrintDocument();
379             pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
380             // 打印文档
381             pd.Print();
382         }
383
384         private void pd_PrintPage(object sender, PrintPageEventArgs ev)
385         {
386             //ev.Graphics.DrawString(richTextbox.Text);
387             //ev.HasMorePages = true;
388         }
389     }
390
391     /// <summary>
392     /// 字体大小
393     /// </summary>
394     public class FontSizeRichFormat : BaseRichFormat
395     {
396         public override void SetFormat(RichTextBox rtbInfo)
397         {
398             string fontSize = rtbInfo.Tag.ToString();
399             float fsize = 0.0f;
400             if (float.TryParse(fontSize, out fsize)) {
401                 rtbInfo.SelectionFont = new Font(rtbInfo.Font.FontFamily, fsize, rtbInfo.SelectionFont.Style);
402             }
403             rtbInfo.Focus();
404         }
405     }
406 }

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

 1 using DemoRichText.Model;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.ComponentModel;
 5 using System.Data;
 6 using System.Drawing;
 7 using System.Linq;
 8 using System.Text;
 9 using System.Threading.Tasks;
10 using System.Windows.Forms;
11
12 namespace DemoRichText
13 {
14     public partial class MainForm : Form
15     {
16         public MainForm()
17         {
18             InitializeComponent();
19         }
20
21
22         public void btnButtonClick(object sender, EventArgs e) {
23             Button btn = (Button)sender;
24             BTNType btnType;
25             if (Enum.TryParse<BTNType>(btn.Tag.ToString(), out btnType)) {
26                 if (btnType == BTNType.Search) {
27                     if (!string.IsNullOrEmpty(this.txtSearch.Text.Trim()))
28                     {
29                         this.rtbInfo.Tag = this.txtSearch.Text.Trim();
30                     }
31                     else {
32                         return;
33                     }
34
35                 }
36                 IRichFormat richFomat = RichFormatFactory.CreateRichFormat(btnType);
37                 richFomat.SetFormat(this.rtbInfo);
38             }
39         }
40
41         private void combFontSize_SelectedIndexChanged(object sender, EventArgs e)
42         {
43             float fsize = 12.0f;
44             if (combFontSize.SelectedIndex > -1) {
45                 if (float.TryParse(combFontSize.SelectedItem.ToString(), out fsize)) {
46                     rtbInfo.Tag = fsize.ToString();
47                     IRichFormat richFomat = RichFormatFactory.CreateRichFormat(BTNType.FontSize);
48                     richFomat.SetFormat(this.rtbInfo);
49                 }
50                 return;
51             }
52         }
53     }
54 }

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

源码下载链接

源码链接

时间: 2024-10-25 23:19:18

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

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

本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: 1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" content="width=device-width&qu

简单文本编辑器制作

对于文本编辑器,最关键的知识点,就是 插入符号 的操作了... windows中有5个基本的插入符号函数: CreateCaret:创建和窗口关联的插入符号 SetCaretPos:设置窗口内的插入符号的位置 ShowCaret:显示插入符号 HideCaret:隐藏插入符号 DestroyCaret:销毁插入符号 对于插入符号的相关函数: GetCaretPos:获得当前插入符号位置的函数 GetCaretBlinkTime SetCaretBlinkTime获得和设置插入符号闪烁的时间函数

微信公众平台二 文本编辑器与表单工具

一.排版 微信公众号,尤其是订阅号是一个自媒体平台,所以发布的内容经过精心的排版是很重要的.然而微信自带的文本编辑器,能够提供的效果有限(虽然能够支持很多种效果,但没有可视化的模板).我选择了一款第三方微信文本编辑器——秀米.网址为xiumi.us.注册登录后,图文排版—>添加新的图文,进入到如下界面: 其中,系统模板功能十分好用,只需要把合适的组件拖入右侧的编辑区,放在合适的位置上,然后在模板内进行编辑,因为组件多样化,所以排版更加灵活易定制.多试试吧!相信你很快就能熟练,下面展示我编辑的一篇

精品软件 推荐 相当优秀的轻量级文本编辑器 Notepad2

Notepad2 是一个相当优秀的轻量级文本编辑器.Notepad2 是基于 Scintilla 开发,体积小巧.运行快速,与系统默认记事本具备相同资源消耗,但提供了大量实用功能,如代码高亮.编码转换.行号显示.多步 Ctrl+Z.增强的查找替换等等,是代替系统默认 Notepad 的极致选择. Notepad2 是一款开源软件,XhmikosR 又在 Notepad2 基础上二次开发了更加实用强大的 Notepad2-mod,额外提供代码折叠.书签.自动完成.支持更多代码格式高亮等功能,更加地

qt文本编辑器

示例代码: mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtGui> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); isSaved =false; curFile = tr(&

BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

splay..( BZOJ 1507 题目基本相同..双倍经验 ) ----------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i <

Java笔记第五篇 文本编辑器初见面

#日常唠叨#从现在开始,又要开始讲理论了,小星星努力今天写完文本编辑器之后再用2天时间写完数据类型,然后上代码,另外关于HelloWorld代码的讲解小星星会在写完运算符之后写 编译厉害归厉害,但对我们打代码的流畅度.心情舒畅度有用吗?答案是没用.相信大家用记事本编写代码之后已经心生厌烦了吧?如果这么打上上千行肯定吐血.那小星星现在给大家升级一下记事本. 升级过后的记事本叫啥名字?当然是叫超级记事本文本编辑器啦!小星星在这里推荐以下三款文本编辑器: UltraEdit:是一款功能强大的文本编辑器

Django中使用富文本编辑器Uedit

Uedit是百度一款非常好用的富文本编辑器 一.安装及基本配置 官方GitHub(有详细的安装使用教程):https://github.com/zhangfisher/DjangoUeditor 1. settings.py INSTALLED_APPS = [ ... 'DjangoUeditor', ... ] 2. 配置urls from django.conf.urls import url, include urlpatterns = [ # 富文本相关url url(r'^uedit

强大好用的&quot;文本&quot;编辑器

1 editplugs 说明:EditPlus是一款由韩国 Sangil Kim (ES-Computing)出品的小巧但是功能强大的可处理文本.HTML和程序语言的Windows编辑器,你甚至可以通过设置用户工具将其作为C,Java,Php等等语言的一个简单的IDE. 地址:https://www.editplus.com/ 授权:收费使用 跨平台:windows/mac 2 notepad++ 说明:Notepad++是 Windows操作系统下的一套文本编辑器,除了可以用来制作一般的纯文字