-
c#文档编辑器
-
该文档编辑器,基本功能:
文件操作: 新建,打开,保存,退出; //支持rtf文件
编辑操作: 复制,剪切,粘贴,全选;
查找与替换: 设计查找(替换)窗口,支持查找(替换)操作 。
格式操作: 字体,颜色,左对齐,右对齐,居中对齐,加粗,斜体,下划线
附加功能:插入图片 -
1.使用richtextbox控件,比如加粗,斜体,下划线,左对齐右对齐居中对齐等等都是一条语句搞定,其中字体和调整颜色的对话框是从工具箱中拖出来的,话不多说,直接看代码:
private void boldToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style ^ FontStyle.Bold);
}
//斜体
private void italicToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style ^ FontStyle.Italic);
}
//下划线
private void underlineToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style ^ FontStyle.Underline);
}
//字体
private void fontToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style ^ FontStyle.Underline);
}
//调整选中的字体的颜色
private void colorToolStripMenuItem_Click(object sender, EventArgs e)
{
if (colorDialog1.ShowDialog() == DialogResult.OK)
richTextBox1.SelectionColor = colorDialog1.Color;
}
//左对齐
private void 左对齐ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.richTextBox1.SelectionAlignment = HorizontalAlignment.Left;
}
//居中对齐
private void 居中对齐ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.richTextBox1.SelectionAlignment = HorizontalAlignment.Center;
}
//右对齐
private void 右对齐ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.richTextBox1.SelectionAlignment = HorizontalAlignment.Right;
}
//调整选中字体的大小
private void 字体大小ToolStripMenuItem_Click(object sender, EventArgs e)
{
if(fontDialog1.ShowDialog() == DialogResult.OK)
richTextBox1.SelectionFont = fontDialog1.Font;
}
//剪切
private void 剪切XToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Cut();
}
//复制
private void 复制VToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Copy();
}
//粘贴
private void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Paste();
}
//撤销
private void toolStripButton11_Click(object sender, EventArgs e)
{
richTextBox1.Undo();
}
- 文件操作:
打开文件:使用Fitter进行文件过滤,打开openfiledialog窗口,获取文件名并显示出来,获取文件格式并将其转换成小写,使用系统io的文件流和读取流读取文件,rtf文件使用richtextbox的loadfile方法显示到text中,其余文件使用io读文件流显示;
保存文件:首先判断是否是已有的文件,如果不是则转到另存为界面进行保存,获取文件格式,根据文件格式选择richtextbox.savefile的格式,rtf采用richtextbox,doc或者txt采用plaintext,uni采用unicodeplaintext,其他使用plaintext;
另存为与保存类似,根据文件格式保存;
新建则是直接调用另存为事件;
private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "文本文件|*.txt;*.html;*.docx;*.doc;*.rtf|所有文件|*.*";//文件打开的过滤器;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
title = openFileDialog1.FileName;
this.Text = title; //显示打开的文件名
richTextBox1.Modified = false;
string ext = title.Substring(title.LastIndexOf(".") + 1); //获取文件格式;
ext = ext.ToLower(); //转换成小写
System.IO.FileStream fs = new System.IO.FileStream(title, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.StreamReader sr = new System.IO.StreamReader(fs,Encoding.Default);//以UTF-8格式进行读取文件
if(ext == "rtf") //加载rtf文件
{
richTextBox1.LoadFile(title, RichTextBoxStreamType.RichText);
}
else
{
richTextBox1.Text = sr.ReadToEnd();//读取文件流从当前位置到结尾的所有字符
}
fs.Close();
sr.Close();
}
3.最难的应该是替换和查找功能了,我是自定义事件然后使用委托实现的:
第一步是在查找替换窗口定义委托类型和事件:
//定义handler委托类型
public delegate void SearchEventHandle(object sender, SearchEventArgsClass e);
public delegate void ReplaceEventHandle(object sender, ReplaceEventArgClass e);
//定义查找事件
public event SearchEventHandle SearchEvent;
//定义替换事件
public event ReplaceEventHandle ReplaceEvent;
第二步是在查找窗口分别创建替换和查找类定义参数:
//查找参数类型
public class SearchEventArgsClass : EventArgs
{
private string searchString; //要查找的字符串
public SearchEventArgsClass(string str)
{
this.searchString = str;
}
public string SearchString
{
get { return this.searchString; }
set { this.searchString = value; }
}
}
//替换类型参数
public class ReplaceEventArgClass : EventArgs
{
private string searchString; //要替换的字符串
private string replaceString; //新的字符串字符串
public ReplaceEventArgClass(string str1, string str2)
{
this.searchString = str1;
this.replaceString = str2;
}
public string SearchString
{
get { return this.searchString; }
set { this.searchString = value; }
}
public string ReplaceString
{
get { return this.replaceString; }
set { this.replaceString = value; }
}
}
第三步还是在查找替换窗口,触发事件:
//查找按钮
private void button1_Click(object sender, EventArgs e)
{
//如果查询的内容为空,无反应
if (this.textBox1.Text.Length == 0)
return;
//触发查找事件
else if (SearchEvent != null)
{
SearchEventArgsClass ee = new SearchEventArgsClass(this.textBox1.Text);
SearchEvent(sender, ee);
}
}
//替换按钮
private void button3_Click(object sender, EventArgs e)
{
if (this.textBox2.Text.Length == 0)
return;
if(ReplaceEvent != null)
{
ReplaceEventArgClass ee = new ReplaceEventArgClass(this.textBox2.Text, this.textBox3.Text);
ReplaceEvent(sender, ee);
}
}
最后一步在主窗口中编写实例方法,并且将其和查找窗口中的委托事件关联起来然后在主窗口中调用就行了:
//查找执行函数
private void MySearch(object sender, SearchEventArgsClass e)
{
string strToSearch = e.SearchString; //查找的字符串
//如果查找字符串为空,则不反应
if (strToSearch.Length == 0)
return;
int start = richTextBox1.SelectionStart;//查找起始位置
//调用richtextbox的find方法进行查询,区分大小写
start = richTextBox1.Find(strToSearch, start, RichTextBoxFinds.MatchCase);
//查询到尾部,结束查询,弹出对话框
if (start == -1)
{
MessageBox.Show("已查找到文档的结尾", "查找结束对话框");
start = 0;
}
else {
start = start + strToSearch.Length;//查找下一处,从该位置开始查询
//选中查询到的字符串
richTextBox1.Select();
richTextBox1.Focus();
}
}
//替换执行函数:
private void MyReplace(object sender, ReplaceEventArgClass e)
{
string strToSearch = e.SearchString; //要替换的字符串
string strToReplace = e.ReplaceString; //新的字符串
//如果要替换的字符串或者新的字符串为空,则无反应
if (strToReplace.Length == 0 || richTextBox1.SelectionLength == 0) return;
//将选中的字符串替换成新的字符串
richTextBox1.SelectedText = e.ReplaceString;
int start = richTextBox1.SelectionStart;
start = richTextBox1.Find(strToSearch, start, RichTextBoxFinds.MatchCase);
if (start == -1)
{
MessageBox.Show("已查找到文档的结尾", "查找结束对话框");
start = 0;
}
else
{
start = start + strToSearch.Length;
richTextBox1.Select();
richTextBox1.Focus();
}
}
//将查找窗口的事件和主窗口的函数关联起来
private void 查找替换ToolStripMenuItem_Click(object sender, EventArgs e)
{
form2 SR = new form2(this);
SR.Show();//打开非模式对话框
//创建委托实例,并使用委托的多播使得每一次查找下一处不需要重头开始
SR.SearchEvent += new form2.SearchEventHandle(MySearch); //订阅查找事件
SR.ReplaceEvent += new form2.ReplaceEventHandle(MyReplace);//订阅替换事件
程序执行结果: