搜档网
当前位置:搜档网 › 项目一:文本编辑器的设计与实现

项目一:文本编辑器的设计与实现

项目一:文本编辑器的设计与实现
项目一:文本编辑器的设计与实现

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

项目一:文本编辑器的设计与实现

【项目背景】

文本编辑器有两类:单文档和多文档文本编辑器。单文档文本编辑器一次只能打开一个文件,如果要打开另一个文件,必须关闭当前打开的文件,微软的写字板程序就是单文档字处理程序。多文档文本编辑器允许同时打开多个文件,每个文件占用一个子窗口,微软的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():

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注方法Undo():

方法Redo():

二、功能设计与实现

1、剪贴板功能

放RichTextBox控件到窗体。属性Name=richTextBox1,Dock=Fill,Text=""。

private void menuItemEditCut_Click(object sender,EventArgs e)

{ richTextBox1.Cut(); } //剪切

private void menuItemEditCopy_Click(object sender,EventArgs e)

{ richTextBox1.Copy(); } //拷贝

private void menuItemEditPaste_Click(object sender,EventArgs e)

{ richTextBox1.Paste(); } //粘贴

private void menuItemEditUndo_Click(object sender,EventArgs e)

{ richTextBox1.Undo(); } //撤销

private void menuItemEditRedo_Click(object sender,EventArgs e)

{ richTextBox1.Redo(); } //恢复

2、存取文件功能

文本编辑器都应具有文件存取功能,菜单顶级菜单项“文件”的弹出菜单中一般包括如下菜单项:新建、打开、关闭、保存和另存为等。需要用到打开文件对话框(OpenFileDialog控件)和保存文件对话框(SaveFileDialog控件)。和

两个对话框的常用属性和方法:

属性Filter:例如Filter=“纯文本文件(*.txt)|*.txt|所有文件(*.*)|*.*”

属性FilterIndex:

属性FileName:

属性InitialDirectory:

属性DefaultExt:

方法ShowDialog():

存取文件功能实现如下:

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

把OpenFileDialog和SaveFileDialog控件放到窗体中。为菜单增加顶级菜单项:文件,为其弹出菜单增加菜单项:新建、打开...、保存...、另存为...、退出。修改这些菜单项的Name属性分别为:mainMenuFile、menuItemFileNew、menuItemFileOpen、menuItemFileSave、menuItemFileSaveAs、menuItemFileExit。

为Form1类中定义变量:string s_FileName=“”,记录当前编辑的文件名

private void menuItemFileNew_Click(object sender,EventArgs e) //新建文件菜单项

{ richTextBox1.Text=""; //或richTextBox1.Clear();

s_FileName=""; //新建文件没有文件名。

}

private void menuItemFileOpen_Click( //打开文件菜单项

object sender,EventArgs e)

{ if(openFileDialog1.ShowDialog()==DialogResult.OK)

{ s_FileName=openFileDialog1.FileName;

richTextBox1.LoadFile(openFileDialog1.FileName,

RichTextBoxStreamType.PlainText);

}

}

private void menuItemFileSaveAs_Click( //另存为菜单项

object sender,EventArgs e)

{ if(saveFileDialog1.ShowDialog()==DialogResult.OK)

{ s_FileName=saveFileDialog1.FileName;

richTextBox1.SaveFile(saveFileDialog1.FileName,

RichTextBoxStreamType.PlainText);

} //注意存取文件类型应一致。

}

private void menuItemSaveFile_Click( //保存文件菜单项

object sender,EventArgs e)

{ if(s_FileName.Length!=0)

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

richTextBox1.SaveFile(s_FileName,

RichTextBoxStreamType.PlainText);

else

menuItemFileSaveAs_Click(sender,e);

}

private void menuItemExit_Click( //退出菜单项

object sender,EventArgs e)

{ Close(); }

3、修改字体

为修改使用的字体,可打开字体对话框FontDialog,选择指定字体。可以按两种方式修改字体,如果未选中文本,表示以后键入的字符将按选定字体输入。如果选中文本,则仅修改选定文本的字体。修改字符颜色也根据同样原则。修改字体要用到FontDialog控件

可以用FontDialog对话框选定指定字体,FontDialog控件和OpenDialog控件的属性和方法基本相同,这里只介绍属性Font,它代表用FontDialog对话框选定的字体。

修改字体实现方法:

放FontDialog控件到窗体,属性Name=fontDialog1。为菜单增加顶级菜单项:格式,属性Name为mainMenuModel,为其弹出菜单增加菜单项:字体,属性Name为menuItemModelFont,为菜单“格式|字体”菜单项增加单击事件处理函数如下:

private void menuItemModelFont_Click(

object sender,EventArgs e)

{ if(fontDialog1.ShowDialog()==DialogResult.OK)

richTextBox1.SelectionFont=fontDialog1.Font;

}

4、About对话框

单击菜单"项目|添加Windows窗体"菜单项,弹出对话框,添加一个窗体,修改formAbout 窗体属性StartPosition=CenterParent,修改属性MaximizeBox=False,MinimizeBox=False,属性FormBorderStyle=FixedDialog

标题为“确定”按钮单击事件处理函数如下:

private void button1_Click(object sender,EventArgs e)

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

{ Close(); }

为菜单增加顶级菜单项:帮助,为其弹出菜单增加标题为“关于…”的菜单项,属性Name为menuItemAbout。菜单“帮助|关于…”菜单项单击事件处理函数如下:

private void menuItemAbout_Click(

object sender,EventArgs e)

{ formAbout AboutDialog=new formAbout();

AboutDialog.ShowDialog(this);//打开模式对话框

} //注意不能使用Show()函数,它打开非模式对话框

5、文本编辑器查找替换功能

首先介绍模式对话框和非模式对话框的概念。并使用非模式对话框在文本编辑器中实现查找和替换功能。

(1)模式对话框和非模式对话框

模式对话框和非模式对话框的区别是:…

两类对话框本质上都是窗体,是Form类的派生类,只是打开时使用的方法不一样,打开模式对话框,使用方法ShowDialog(),而打开非模式对话框,使用方法Show()。

(2)查找替换功能的实现

建立新窗体,窗体文件名称为formFindReplace.cs,作为"查找替换"对话框。窗体类名也为formFindReplace,为formFindReplace类增加变量:Form1 MainForm1;

属性StartPosition=CenterParent,MaximizeBox=False,MinimizeBox=False, FormBorderStyle=FixedDialog, Text=“查找和替换”修改formFindReplace类构造函数如下,增加的参数form1是主窗体属性Name的值。

public formFindReplace(Form1 form1)

{ InitializeComponent();

MainForm1=form1;//新增语句,记录主窗体属性Name的值

}//有了Form1引用,可以在formFindReplace类中调用Form1类的公有方法

查找替换对话框中标题为“查找下一个”按钮单击事件函数如下:

private void buttonFind_Click(object sender,EventArgs e)

{ if(textBox1.Text.Length!=0)

//MainForm1.FindRichTextBoxString方法见后面定义

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

MainForm1.FindRichTextBoxString(textBox1.Text);

else

MessageBox.Show(“查找字符串不能为空”,

"提示",MessageBoxButtons.OK);

} //MessageBox是对话框

查找替换对话框中标题为“替换查到字符”按钮单击事件函数如下:

private void buttonReplace_Click(object sender,EventArgs e)

{ if(textBox2.Text.Length!=0)

MainForm1.ReplaceRichTextBoxString(textBox2.Text);

else // MainForm1.ReplaceRichTextBoxString后面定义

MessageBox.Show(“替换字符串不能为空”,

"提示", MessageBoxButtons.OK);

}

为Form1类增加变量:int FindPostion=0,该变量用来记录下一次查找的开始位置。为Form1窗体菜单的"编辑"顶级菜单项的弹出菜单增加菜单项:查找和替换,属性Name为menuItemFindReplace。"查找和替换"菜单项单击事件处理函数如下:

private void menuItemFindReplace_Click(

object sender,EventArgs e)

{ FindPostion=0; //下句中的this是Form1类对象引用

formFindReplace FindReplaceDialog=new formFindReplace(this);

FindReplaceDialog.Show(); }//打开非模式对话框使用Show()方法

定义FindRichTextBoxString方法

public void FindRichTextBoxString(string FindString)

{ if(FindPostion>=richTextBox1.Text.Length) { MessageBox.Show(“已到文本底部,再次查找将从文本开始处查找”,"提示",MessageBoxButtons.OK);

FindPostion=0; //下次查找的开始位置

return;

}

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注FindPostion=richTextBox1.Find(FindString,FindPostion,

RichTextBoxFinds.MatchCase);

if(FindPostion==-1)//-1表示未找到匹配字符串,提示用户

{ MessageBox.Show("未找到匹配字符串,再次查找将从文本开始处查找","提示", MessageBoxButtons.OK);

FindPostion=0; //下次查找的开始位置

}

else //找到匹配字符串

{ richTextBox1.Focus(); //主窗体成为注视窗口

FindPostion+=FindString.Length;

} //下次查找的开始位置在此次找到字符串之后

}

替换字符串的方法:

public void ReplaceRichTextBoxString(

string ReplaceString)

{ 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,表示继续操作,

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

该函数返回false,表示忽略此次操作。之所以要增加这个函数是因为有三处要用到此函数。该函数定义如下:

public bool IfSaveOldFile()

{ bool ReturnValue=true;

if(bSave)

{ System.Windows.Forms.DialogResult dr;

dr=MessageBox.Show(this,“要保存当前更改吗?”,

"保存更改吗?", MessageBoxButtons.YesNoCancel,

MessageBoxIcon.Question);

switch(dr) //根据用户选择做相应处理

{ case System.Windows.Forms.DialogResult.Yes: bSave=false;//保存文件后,应使bSave为false

if(s_FileName.Length!=0)

richTextBox1.SaveFile(s_FileName,

RichTextBoxStreamType.PlainText);

else

{ SaveFileDialog saveFileDialog1=

new SaveFileDialog(); if(saveFileDialog1.ShowDialog()==

DialogResult.OK)

{ s_FileName=saveFileDialog1.FileName;

richTextBox1.SaveFile(s_FileName,

RichTextBoxStreamType.PlainText);

}

} //返回true通知调用本方法的程序本次操作继续

ReturnValue=true;

break;

//单击了no按钮,不保存

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注case System.Windows.Forms.DialogResult.No:

bSave=false;

ReturnValue=true;

break;

//单击了Cancel按钮

case System.Windows.Forms.DialogResult.Cancel:

ReturnValue=false;

break;

} //返回false,通知调用本方法的程序,本次操作取消

}

return ReturnValue;

}

在菜单“文件|新建”和“文件|打开”菜单项的事件函数的第1条语句前增加如下语句:if(!IfSaveOldFile()) //如果返回false本次操作取消

return;

修改菜单“文件|保存...”菜单项单击事件处理函数如下:

private void menuItemSaveFile_Click(

object sender,EventArgs e)

{ if(s_FileName.Length!=0)

{ bSave=false; richTextBox1.SaveFile(s_FileName,

RichTextBoxStreamType.PlainText);

}

else

menuItemSaveAs_Click(sender,e);

}

修改菜单“文件|另存为...”菜单项单击事件函数如下:

private void menuItemSaveAs_Click(

课程: C# Windows程序设计学年第_ _学期第周月日教学内容备注

object sender,EventArgs e)

{ SaveFileDialog saveFileDialog1=new SaveFileDialog();

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事件增加事件函数如下:

private void richTextBox1_TextChanged(

object sender,EventArgs e)

{ bSave=true; }

窗体Form1的FormClosing事件是在关闭窗口之前产生的事件,此时,窗体中的控件还存在,还可以保存修改的内容,也可以不退出。增加Closing事件的事件处理函数如下:

private void Form1_FormClosing(object sender,

FormClosingEventArgs e)

{ if(!IfSaveOldFile())

e.Cancel=true; }//不退出,程序继续运行

三、学生工作任务

设计一个文本编辑器,功能要求至少要有新建、打开、保存、另存为、页面设置、打印、退出、撤消、剪切、复制、粘贴、删除、查找、替换等,可以通过查阅资料,对以上功能进行补充。

文本编辑器c++实验报告附源代码

四川大学软件学院 实验报告 课程名称数据结构实验课时8 实验项目文本编辑器实验时间12到14周实验目的了解c++类的封装和KMP算法。 实验环境 Windows平台 VC6.0++ 实验内容(算法、程序、步骤和方法) 部分函数创建思想: 创建过程如下: a、定义LinkList指针变量*temp: LinkList *temp; b、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i; c、申请动态存储空间:head->next=(LinkList *)malloc(sizeof(LinkList)); d、首行头指针的前驱指针为空:head->pre=NULL; 首行指针:temp=head->next; 首行指针的前驱指针也为空:temp->pre=NULL; 定义没输入字符时文章长度为0:temp->length=0; 初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++) temp->data[i]='\0'; e、利用循环进行文本输入 for(j=0;jdata[i]=ch; //给temp指向的行赋值 ···· temp->length++;//行中字符长度加1 if(ch=='#') {NUM=j; break; //文章结束时,Num来记录整个文章的行数 }}} 在字符输入的过程中,如果在单行输入的字符超过了80个字符, 则需要以下操作: 输入字符数大于80,重新分配空间建立下一行 temp->next=(LinkList *)malloc(sizeof(LinkList)) ;

几种常用网页文本编辑器总结

文本编辑器应用总结 一.lhgeditor文本编辑器 lhgeditor组件文件结构: 1. lhgeditor.js:组件的核心JS文件 2. lhgeditor.css:组件的样式表文件 3. images:组件所需的图片都在此文件夹中 以上三个文件为组件所必须的三个文件,组件包中其它以“_”开头的文件为示例的演示文件,实际使用中不需要这些文件。当然框架核心文件lhgcore.js是每个组件都必须用到的文件,记得加载组件前先要加载此文件。 lhgeditor组件使用说明: 1. 在调用组件的页面加载lhgcore.j s和lhgeditor.js两个文件。 2. 在window.onload函数里加入J.editor.add(编辑器的id).init(); 例:

二.nicEdit文本编辑器