项目一文本编辑器的设计与实现.docx
《项目一文本编辑器的设计与实现.docx》由会员分享,可在线阅读,更多相关《项目一文本编辑器的设计与实现.docx(10页珍藏版)》请在冰豆网上搜索。
![项目一文本编辑器的设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/12/32adb89b-0c3a-4804-a648-87aadac09165/32adb89b-0c3a-4804-a648-87aadac091651.gif)
项目一文本编辑器的设计与实现
项目一:
文本编辑器的设计与实现
【项目背景】
文本编辑器有两类:
单文档和多文档文本编辑器。
单文档文本编辑器一次只能打开一个文件,如果要打开另一个文件,必须关闭当前打开的文件,微软的写字板程序就是单文档字处理程序。
多文档文本编辑器允许同时打开多个文件,每个文件占用一个子窗口,微软的Word程序就是多文档字处理程序。
本项目主要介绍建立单文档文本编辑器的方法,通过分析现有文本编辑器的功能与操作过程,利用C#开发一个新的文本编辑器。
【主要内容与技能要求】
(1)会进行复杂窗口设计
(2)会对常见的文本编辑功能进行分析与编码实现
(3)会设计多文档窗口
一、预备知识
本项目主要利用RichTextBox控件来构成文本编辑区域。
1、RichTextBox控件的主要属性
属性SelectedText、SelectionLength、SelectionStart:
属性SelectionFont:
属性SelectionColor:
属性Lines:
属性Modified:
事件SelectionChange:
事件TextChanged:
2、RichTextBox控件的主要方法
方法Clear():
方法Copy()、Cut()、Paste():
方法SelectAll():
方法Find():
方法SaveFile()和LoadFile():
方法Undo():
方法Redo():
二、功能设计与实现
1、剪贴板功能
放RichTextBox控件到窗体。
属性Name=richTextBox1,Dock=Fill,Text=""。
privatevoidmenuItemEditCut_Click(objectsender,EventArgse)
{richTextBox1.Cut();}//剪切
privatevoidmenuItemEditCopy_Click(objectsender,EventArgse)
{richTextBox1.Copy();}//拷贝
privatevoidmenuItemEditPaste_Click(objectsender,EventArgse)
{richTextBox1.Paste();}//粘贴
privatevoidmenuItemEditUndo_Click(objectsender,EventArgse)
{richTextBox1.Undo();}//撤销
privatevoidmenuItemEditRedo_Click(objectsender,EventArgse)
{richTextBox1.Redo();}//恢复
2、存取文件功能
文本编辑器都应具有文件存取功能,菜单顶级菜单项“文件”的弹出菜单中一般包括如下菜单项:
新建、打开、关闭、保存和另存为等。
需要用到打开文件对话框(OpenFileDialog控件)和保存文件对话框(SaveFileDialog控件)。
和
两个对话框的常用属性和方法:
属性Filter:
例如Filter=“纯文本文件(*.txt)|*.txt|所有文件(*.*)|*.*”
属性FilterIndex:
属性FileName:
属性InitialDirectory:
属性DefaultExt:
方法ShowDialog():
存取文件功能实现如下:
把OpenFileDialog和SaveFileDialog控件放到窗体中。
为菜单增加顶级菜单项:
文件,为其弹出菜单增加菜单项:
新建、打开...、保存...、另存为...、退出。
修改这些菜单项的Name属性分别为:
mainMenuFile、menuItemFileNew、menuItemFileOpen、menuItemFileSave、menuItemFileSaveAs、menuItemFileExit。
为Form1类中定义变量:
strings_FileName=“”,记录当前编辑的文件名
privatevoidmenuItemFileNew_Click(objectsender,EventArgse)//新建文件菜单项
{richTextBox1.Text="";//或richTextBox1.Clear();
s_FileName="";//新建文件没有文件名。
}
privatevoidmenuItemFileOpen_Click(//打开文件菜单项
objectsender,EventArgse)
{if(openFileDialog1.ShowDialog()==DialogResult.OK)
{s_FileName=openFileDialog1.FileName;richTextBox1.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}
}
privatevoidmenuItemFileSaveAs_Click(//另存为菜单项
objectsender,EventArgse)
{if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{s_FileName=saveFileDialog1.FileName;
richTextBox1.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}//注意存取文件类型应一致。
}
privatevoidmenuItemSaveFile_Click(//保存文件菜单项
objectsender,EventArgse)
{if(s_FileName.Length!
=0)
richTextBox1.SaveFile(s_FileName,
RichTextBoxStreamType.PlainText);
else
menuItemFileSaveAs_Click(sender,e);
}
privatevoidmenuItemExit_Click(//退出菜单项
objectsender,EventArgse)
{Close();}
3、修改字体
为修改使用的字体,可打开字体对话框FontDialog,选择指定字体。
可以按两种方式修改字体,如果未选中文本,表示以后键入的字符将按选定字体输入。
如果选中文本,则仅修改选定文本的字体。
修改字符颜色也根据同样原则。
修改字体要用到FontDialog控件
可以用FontDialog对话框选定指定字体,FontDialog控件和OpenDialog控件的属性和方法基本相同,这里只介绍属性Font,它代表用FontDialog对话框选定的字体。
修改字体实现方法:
放FontDialog控件到窗体,属性Name=fontDialog1。
为菜单增加顶级菜单项:
格式,属性Name为mainMenuModel,为其弹出菜单增加菜单项:
字体,属性Name为menuItemModelFont,为菜单“格式|字体”菜单项增加单击事件处理函数如下:
privatevoidmenuItemModelFont_Click(
objectsender,EventArgse)
{if(fontDialog1.ShowDialog()==DialogResult.OK)
richTextBox1.SelectionFont=fontDialog1.Font;
}
4、About对话框
单击菜单"项目|添加Windows窗体"菜单项,弹出对话框,添加一个窗体,修改formAbout窗体属性StartPosition=CenterParent,修改属性MaximizeBox=False,MinimizeBox=False,属性FormBorderStyle=FixedDialog
标题为“确定”按钮单击事件处理函数如下:
privatevoidbutton1_Click(objectsender,EventArgse)
{Close();}
为菜单增加顶级菜单项:
帮助,为其弹出菜单增加标题为“关于…”的菜单项,属性Name为menuItemAbout。
菜单“帮助|关于…”菜单项单击事件处理函数如下:
privatevoidmenuItemAbout_Click(
objectsender,EventArgse)
{formAboutAboutDialog=newformAbout();
AboutDialog.ShowDialog(this);//打开模式对话框
}//注意不能使用Show()函数,它打开非模式对话框
5、文本编辑器查找替换功能
首先介绍模式对话框和非模式对话框的概念。
并使用非模式对话框在文本编辑器中实现查找和替换功能。
(1)模式对话框和非模式对话框
模式对话框和非模式对话框的区别是:
…
两类对话框本质上都是窗体,是Form类的派生类,只是打开时使用的方法不一样,打开模式对话框,使用方法ShowDialog(),而打开非模式对话框,使用方法Show()。
(2)查找替换功能的实现
建立新窗体,窗体文件名称为formFindReplace.cs,作为"查找替换"对话框。
窗体类名也为formFindReplace,为formFindReplace类增加变量:
Form1MainForm1;
属性StartPosition=CenterParent,MaximizeBox=False,MinimizeBox=False,FormBorderStyle=FixedDialog,Text=“查找和替换”修改formFindReplace类构造函数如下,增加的参数form1是主窗体属性Name的值。
publicformFindReplace(Form1form1)
{InitializeComponent();
MainForm1=form1;//新增语句,记录主窗体属性Name的值
}//有了Form1引用,可以在formFindReplace类中调用Form1类的公有方法
查找替换对话框中标题为“查找下一个”按钮单击事件函数如下:
privatevoidbuttonFind_Click(objectsender,EventArgse)
{if(textBox1.Text.Length!
=0)
//MainForm1.FindRichTextBoxString方法见后面定义
MainForm1.FindRichTextBoxString(textBox1.Text);
else
MessageBox.Show(“查找字符串不能为空”,
"提示",MessageBoxButtons.OK);
}//MessageBox是对话框
查找替换对话框中标题为“替换查到字符”按钮单击事件函数如下:
privatevoidbuttonReplace_Click(objectsender,EventArgse)
{if(textBox2.Text.Length!
=0)
MainForm1.ReplaceRichTextBoxString(textBox2.Text);
else//MainForm1.ReplaceRichTextBoxString后面定义
MessageBox.Show(“替换字符串不能为空”,
"提示",MessageBoxButtons.OK);
}
为Form1类增加变量:
intFindPostion=0,该变量用来记录下一次查找的开始位置。
为Form1窗体菜单的"编辑"顶级菜单项的弹出菜单增加菜单项:
查找和替换,属性Name为menuItemFindReplace。
"查找和替换"菜单项单击事件处理函数如下:
privatevoidmenuItemFindReplace_Click(
objectsender,EventArgse)
{FindPostion=0;//下句中的this是Form1类对象引用
formFindReplaceFindReplaceDialog=newformFindReplace(this);
FindReplaceDialog.Show();}//打开非模式对话框使用Show()方法
定义FindRichTextBoxString方法
publicvoidFindRichTextBoxString(stringFindString)
{if(FindPostion>=richTextBox1.Text.Length){MessageBox.Show(“已到文本底部,再次查找将从文本开始处查找”,"提示",MessageBoxButtons.OK);
FindPostion=0;//下次查找的开始位置
return;
}
FindPostion=richTextBox1.Find(FindString,FindPostion,
RichTextBoxFinds.MatchCase);
if(FindPostion==-1)//-1表示未找到匹配字符串,提示用户
{MessageBox.Show("未找到匹配字符串,再次查找将从文本开始处查找","提示",MessageBoxButtons.OK);
FindPostion=0;//下次查找的开始位置
}
else//找到匹配字符串
{richTextBox1.Focus();//主窗体成为注视窗口
FindPostion+=FindString.Length;
}//下次查找的开始位置在此次找到字符串之后
}
替换字符串的方法:
publicvoidReplaceRichTextBoxString(
stringReplaceString)
{if(richTextBox1.SelectedText.Length!
=0)
richTextBox1.SelectedText=ReplaceString;
}//替换被选定的字符串
6、对话框MessageBox
MessageBox.Show(this,"要保存当前更改吗?
","保存更改吗?
",
MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);
7、提示保存已被修改的文件
为Form1类增加一个bool变量bSave=false作为标记,用来跟踪控件RichTextBox中的文本内容是否被修改。
在程序开始运行、建立和打开一个新文件后,bSave=false,表示如果关闭当前文件,不必提示用户保存当前文件。
当RichTextBox控件中的文本被修改,将激活RichTextBox控件TextChanged事件,在该事件处理函数中,使bSave=true,表示关闭当前文件前,要询问用户是否保存当前已被修改的文件。
首先在主窗体Form1类中增加一个函数,其功能是如果检查到当前文件已被修改,用对话框询问用户是否保存当前文件,根据用户的选择作相应的处理,该函数返回true,表示继续操作,
该函数返回false,表示忽略此次操作。
之所以要增加这个函数是因为有三处要用到此函数。
该函数定义如下:
publicboolIfSaveOldFile()
{boolReturnValue=true;
if(bSave)
{System.Windows.Forms.DialogResultdr;
dr=MessageBox.Show(this,“要保存当前更改吗?
”,
"保存更改吗?
",MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);
switch(dr)//根据用户选择做相应处理
{caseSystem.Windows.Forms.DialogResult.Yes:
bSave=false;//保存文件后,应使bSave为false
if(s_FileName.Length!
=0)
richTextBox1.SaveFile(s_FileName,
RichTextBoxStreamType.PlainText);
else
{SaveFileDialogsaveFileDialog1=
newSaveFileDialog();if(saveFileDialog1.ShowDialog()==
DialogResult.OK)
{s_FileName=saveFileDialog1.FileName;
richTextBox1.SaveFile(s_FileName,
RichTextBoxStreamType.PlainText);
}
}//返回true通知调用本方法的程序本次操作继续
ReturnValue=true;
break;
//单击了no按钮,不保存
caseSystem.Windows.Forms.DialogResult.No:
bSave=false;
ReturnValue=true;
break;
//单击了Cancel按钮
caseSystem.Windows.Forms.DialogResult.Cancel:
ReturnValue=false;
break;
}//返回false,通知调用本方法的程序,本次操作取消
}
returnReturnValue;
}
在菜单“文件|新建”和“文件|打开”菜单项的事件函数的第1条语句前增加如下语句:
if(!
IfSaveOldFile())//如果返回false本次操作取消
return;
修改菜单“文件|保存...”菜单项单击事件处理函数如下:
privatevoidmenuItemSaveFile_Click(
objectsender,EventArgse)
{if(s_FileName.Length!
=0)
{bSave=false;richTextBox1.SaveFile(s_FileName,
RichTextBoxStreamType.PlainText);
}
else
menuItemSaveAs_Click(sender,e);
}
修改菜单“文件|另存为...”菜单项单击事件函数如下:
privatevoidmenuItemSaveAs_Click(
objectsender,EventArgse)
{SaveFileDialogsaveFileDialog1=newSaveFileDialog();
saveFileDialog1.Filter="纯文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
saveFileDialog1.FilterIndex=1;
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{s_FileName=saveFileDialog1.FileName;
richTextBox1.SaveFile(s_FileName,
RichTextBoxStreamType.PlainText);
bSave=false;
}
}
为RichTextBox控件TextChanged事件增加事件函数如下:
privatevoidrichTextBox1_TextChanged(
objectsender,EventArgse)
{bSave=true;}
窗体Form1的FormClosing事件是在关闭窗口之前产生的事件,此时,窗体中的控件还存在,还可以保存修改的内容,也可以不退出。
增加Closing事件的事件处理函数如下:
privatevoidForm1_FormClosing(objectsender,
FormClosingEventArgse)
{if(!
IfSaveOldFile())
e.Cancel=true;}//不退出,程序继续运行
三、学生工作任务
设计一个文本编辑器,功能要求至少要有新建、打开、保存、另存为、页面设置、打印、退出、撤消、剪切、复制、粘贴、删除、查找、替换等,可以通过查阅资料,对以上功能进行补充。