在Windows应用程序开发中,刚刚介绍了WPF版的利用RichTextBox实现文本编辑器,今天继续推出WinForm版的利用RichTextBox实现文本编辑器。本文利用一个简单的小例子,简述如何在WinForm开发中,利用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. 定义接口
为了规范和统一,定义实现样式接口IRichFormat,如下所示:
namespace DemoRichText.Model
{
/// <summary>
/// 富文本框格式
/// </summary>
public interface IRichFormat
{
void SetFormat(RichTextBox rtbInfo);
}
}
2. 实现样式基类
定义一个接口的默认实现基类BaseRichFormat,此基类是抽象类,如下所示:
namespace DemoRichText.Model
{
public abstract class BaseRichFormat : IRichFormat
{
public abstract void SetFormat(RichTextBox rtbInfo);
}
}
3. 具体实现方法
具体到每一个功能样式设置,均继承自BaseRichFormat,如下所示:
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();
}
}
}
4. 实现工厂模式
因为所有实现都基于同一个接口,所以进一步封装样式设置的实现类,如下所示:
namespace DemoRichText.Model
{
public class RichFormatFactory
{
public static IRichFormat CreateRichFormat(BTNType btnType)
{
IRichFormat richFormat;
switch (btnType)
{
case BTNType.Bold:
richFormat = new BoldRichFormat();
break;
case BTNType.BGColor:
richFormat = new BgColorRichFormat();
break;
case BTNType.Center:
richFormat = new CenterRichFormat();
break;
case BTNType.Del:
richFormat = new DelRichFormat();
break;
case BTNType.Font:
richFormat = new FontRichFormat();
break;
case BTNType.ForeColor:
richFormat = new ForeColorRichFormat();
break;
case BTNType.FontSize:
richFormat = new FontSizeRichFormat();
break;
case BTNType.Indent:
richFormat = new IndentRichFormat();
break;
case BTNType.Italic:
richFormat = new ItalicRichFormat();
break;
case BTNType.Left:
richFormat = new LeftRichFormat();
break;
case BTNType.OutIndent:
richFormat = new OutIndentRichFormat();
break;
case BTNType.Pic:
richFormat = new PicRichFormat();
break;
case BTNType.Print:
richFormat = new PrintRichFormat();
break;
case BTNType.Right:
richFormat = new RightRichFormat();
break;
case BTNType.Search:
richFormat = new SearchRichFormat();
break;
case BTNType.StrikeLine:
richFormat = new StrikeLineRichFormat();
break;
case BTNType.SubScript:
richFormat = new SubScriptRichFormat();
break;
case BTNType.SuperScript:
richFormat = new SuperScriptRichFormat();
break;
case BTNType.Ul:
richFormat = new UlRichFormat();
break;
case BTNType.UnderLine:
richFormat = new UnderLineRichFormat();
break;
default:
richFormat = new DefaultRickFormat();
break;
}
return richFormat;
}
}
}
5. UI页面代码
由于实现了代码封装,所有页面代码较少,如下所示:
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;
}
}
}
}
示例效果图
设置文本对应的格式,具体如下所示:
源码下载
关于源码下载,可关注公众号,并回复关键字WINRICH即可,如下所示:
以上就是【详解C#之WinForm版利用RichTextBox 制作文本编辑器】的全部内容,关于更多详细内容,可参考官方文档。希望能够一起学习,共同进步。