本文利用一个简单的小例子【文本编辑器】,讲解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) { } } ////// 加粗格式 /// 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; } } ////// 斜体 /// 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(); } } ////// 下划线 /// 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(); } } ////// 删除线 /// 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(); } } ////// 左对齐 /// public class LeftRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { rtbInfo.SelectionAlignment = HorizontalAlignment.Left; rtbInfo.Focus(); } } ////// 居中对齐 /// 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(); } } ////// 右对齐 /// 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(); } } ////// 缩进对齐 /// public class IndentRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { //每次以10个像素进行缩进 rtbInfo.SelectionIndent = rtbInfo.SelectionIndent + 10; rtbInfo.Focus(); } } ////// 缩进对齐 /// public class OutIndentRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { //每次以10个像素进行缩进 rtbInfo.SelectionIndent = rtbInfo.SelectionIndent - 10; rtbInfo.Focus(); } } ////// 下标 /// public class SubScriptRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionCharOffset < 0) { rtbInfo.SelectionCharOffset = 0; } else { rtbInfo.SelectionCharOffset = -5; } rtbInfo.Focus(); } } ////// 上标 /// public class SuperScriptRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { if (rtbInfo.SelectionCharOffset > 0) { rtbInfo.SelectionCharOffset = 0; } else { rtbInfo.SelectionCharOffset = 5; } rtbInfo.Focus(); } } ////// 字体 /// 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(); } } ////// 文本颜色 /// 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(); } } ////// 文本背景颜色 /// 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(); } } ////// UL列表,项目符号样式 /// 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(); } } ////// 图片插入 /// 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(); } } ////// 删除 /// public class DelRichFormat : BaseRichFormat { public override void SetFormat(RichTextBox rtbInfo) { rtbInfo.SelectedText = ""; rtbInfo.Focus(); } } ////// 查找 /// 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(); } } ////// 打印 /// 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; } } ////// 字体大小 /// 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(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是一个功能丰富的控件,值得学习。
点击文末原文地址下载源码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。