本文利用一个简单的小例子【文本编辑器】,讲解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是一个功能丰富的控件,值得学习。
源码下载链接
来源:https://www.cnblogs.com/hsiang/p/6691420.html
