c多文档文本编辑器txt.doc
《c多文档文本编辑器txt.doc》由会员分享,可在线阅读,更多相关《c多文档文本编辑器txt.doc(19页珍藏版)》请在冰点文库上搜索。
河南城建学院
计算机科学与工程系
课程设计报告
题目名称多文档编辑器
----C#课程设计
姓名亢凯航王星辰高亚楠李飞
专业计算机科学与技术
班级代码0812112
指导教师魏新红
2011年12月28日
目录
目录 2
一、课程设计目的 3
二、设计需求分析 3
三、总体设计 4
四、详细设计及算法分析 4
4.1详细设计 4
4.2算法分析 5
五、调试与测试 5
5.1.调试方法 5
5.2运行结果的分析 5
5.3测试过程中出现的问题及解决方法 6
六.原程序代码与执行结果 7
6.1原程序代码 7
6.2执行结果 17
总结 17
参考资料 18
一、课程设计目的
我们采用C#进行课程设计,首先在于C#和别的语言相比具有其特殊之处。
用C#设计的组件可以很容易的转换成Web服务,可以以任意操作系统的任意语言从Internet上调用。
开发人员可以定义特定域的属性,并将它们应用于任何语言元素如类,接口等。
开发此应用程序的团队使用.NET框架和C#语言创建了多线程的邮件服务。
C#的出现弥补了C语言家族的不足,它具有更强大的功能、具有VB开发的高效性和方便性。
学习这门可视化编程语言,使我们在运用语言编写程序的过程中,能更直观的编写出我们理想中的程序,而且也使我们的编译工作变单易行。
我们学习这门语言的目的,不是仅仅的理论研究。
作为语言,它只是一种工具,因此学习它更重要的是运用它来做有用的程序,这也就是说学习它重在应用。
在实践的基础上对它能更好的掌握,而进行简单的设计就是一种很有效的学习实践方式,这也就是我们学习的主要目的。
可以让我们更加熟练的掌握.net基本结构以及C#语言的基本知识和技能,基本掌握面向对象程序开发的基本思路和方法,掌握文件读写开发的基本知识,可以利用自己所学的基本知识和技能进行简单的可视化应用程序设计。
二、设计需求分析
多文档文本编辑器就是在单文档界面的基础上,应用所学的C#的基本知识对其编辑,做出多文档界面,这是一个挑战,对于只对C#有初步了解的我们有一定的难度。
在查阅课本和相关资料的基础上尝试了解多文档的含义和特征,敢于尝试、不断的完善,充分应用所学的基础知识。
在这个编辑过程中,我们用到了一些的有关菜单的知识和窗体控件,尤其是其属性的理解,熟悉和随机应用。
同时它也综合了有关文件的保存、打开,文档内容的编辑如:
字体、颜色、背景,也实现了文档的剪切、复制、粘贴等编辑功能。
三、总体设计
编写多文档界面应用程序,它和单文档界面应用程序不同,它允许同时显示多个文档,每个文档都显示在自己的窗口中,各文档或窗口之间可以直接进行操作切换。
我们设计的多文档编辑器,具有一个主窗口,称作父窗体,它能包含其他多窗体,子窗体是一个限制为只能在父窗体内出现的窗体。
一个父窗体可以有多个子窗体,但一个子窗体只能有一个父窗体,且子窗体本身不能再是父窗体。
此外,处于活动状态的子窗口最多只能有一个。
四、详细设计及算法分析
4.1详细设计
此次设计内容主要分为三个大的模块,针对多文档编辑的含义定义为窗体模块、文档编辑模块和工具栏模块。
在此基础上分别设计出各模块,并实现其相关的主要功能。
窗体菜单:
帮助菜单
编辑菜单
格式菜单
文件菜单
窗体菜单
4.2算法分析
整合这次设计,针对我们的设计题目,我们主要是在可视化环境下实现的对菜单控件的操
作。
父窗体的菜单项和子窗体的菜单项并不完全相同,最后经过它们的结合而合并为同一个菜单,使运行的最终窗口更加完善。
父窗体菜单部分,也就是Form1窗体的菜单部分分为菜单栏和工具栏。
菜单栏(MennuStrip)主要包含五个菜单项:
文件、编辑、格式、帮助。
子窗体菜单部分有工具栏(ToolStip)包括文件工具、编辑工具、字体工具,右键菜单包括剪切、复制、粘贴。
文件菜单项的新建项:
主要是调用了添加新文档的方法:
Newform1(),这个方法是用新窗口的实例显现出来的。
打开的功能是利用一个组件OpenFileDialog来创建它的实例,通过ShowDialog()这个实例来调用;通过条件if语句来判断并打开所选的文件。
保存通过if条件句判断是否为新建文件,如果是,通过组件saveFileDialog另存为,不是直接在原文件上保存。
另存为的功能直接通过组件saveFileDialog来实现。
退出是先判断是否需要保存,如果是,使用另存为的功能,不是直接调Close()关闭函数来实现的。
帮助菜单项含有关于记事板项。
通过新建form窗体,showDialog()方法模态打开来实现。
文件工具包括打开、保存和另存为三项,主要功能与实现方法与文件菜单的打开、保存、另存为项相同。
编辑工具和右键菜单项主要是剪切、复制、粘贴所选内容。
主要使用了Clipboard类将数据置于剪切板上,和RichTextBox的SelectedText属性选择内容来实现的。
字体工具主要有字体下拉菜单和字号下拉菜单。
通过SelectedIndexChanged事件和SelectionFont的FontFamily属性实现。
五、调试与测试
5.1.调试方法
在设计本应用程序时,我们采用步步为营.整体配合的思想。
也即在设计的过程中,每添加上一部分功能代码,按F5键或VS.NET开发环境下提供的快捷菜单或快捷键后,若提示有错,则根据提示找出出错的地方并加以改正;若正确则继续往下进行。
5.2运行结果的分析
:
从运行结果可以明显地看出来,窗体里面的文件、编辑和格式菜单执行后,会在richTextBox实现。
:
从代码看,好像并无复制、剪切、粘贴等的Click事件处理代码,但为什么这一部分功能可以实现。
这就牵涉到我们学过的事件绑定。
我们知道,在复制菜单中名为menuItemClickerhander的事件处理程序,并在其中加入相应的功能代码,再将取消、剪切、粘贴按钮的Click事件绑定到menuItemClickerhander上即可。
5.3测试过程中出现的问题及解决方法
①:
使文档出现在程序窗体中时,出现this.Name=”Form1”与this.Text=”MDI程序”的异常出错,经过仔细检查,原来是先前对代码含义理解不够深刻,应在AddNewfile()方法中创建子窗体的实例frm,而我们误创建为父窗体的实例,故出错,正确的写法是:
Form2frm=newForm();这样才能与后面的frm.MdiParent=this;相匹配。
②:
为了使用户更方便地使用多文档编辑,我们还运用了快捷菜单,但是当我们将上下文菜单中的取消、剪切、复制和粘贴四个按键均绑定到事件处理程序menuItemClickhander上时,测试仍没有达到我们想要的结果。
原来不仅要将社会分配的ContextMenu属性设置为ContextMenu1,也要将richTextBox的属性设置为ContextMenu1,这样上下方菜单才能与该窗体关联。
但是我们运行后发现还是不可以,分析后明白错误出在取消、剪切、复制和粘贴的Name属性名称因为和菜单中的名字不一样,可将它们改统一或在对应的处理程序中加入或语句,这样程序就可以运行并达到期望的结果。
③:
据题目要求,需在运行时显示状态栏,这将更好地达多文档的思想。
我们采用了加入菜单查看,添加名称为状态的子菜单。
双击后在其Click事件中加入它的执行语句:
this.statusBar1.Text=this.ActiveMdichile.Text;这样运行后就可以通过点击查看菜单中的状态栏来查看目前处于活动状态的文档是所建立的第几个文档。
④:
再就是在运行过程中,会随机地出现未处理的“System.NullReferenceException”类型的异常出现在未知模块中及信息,未将对象引用设置到对象的实例,或出现未处理的“System.ArgumentException”类型的异常出现在system.windows.forms.dll中。
”这样的两个异常错误,点击中断后则会出现提示“没有可用的当前代码”。
六.原程序代码与执行结果
6.1原程序代码
//父窗体部分的源代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;//添加IO命名空间
namespaceWrittenBoard_finally_
{
publicpartialclassForm1:
Form
{
publicForm2f2=newForm2();//新建子窗体
publicForm1()
{
InitializeComponent();
}
//设置默认标题
privatevoidForm1_Load(objectsender,EventArgse)
{
this.Text="新建文本文档";
}
//设置文件菜单的新建项
privatevoid新建ToolStripMenuItem_Click_1(objectsender,EventArgse)
{
Form2frm=newForm2();
frm.MdiParent=this;
this.IsMdiContainer=true;
ToolStripMenuItemnewWindowsItem=newToolStripMenuItem(frm.Text);
窗口ToolStripMenuItem.DropDownItems.Add(newWindowsItem);
frm.Show();//新建窗体之后,在窗口菜单显示新建项,并在父窗体中打开子窗体
//this.menuStrip1.Visible=false;
//this.toolStrip1.Visible=false;
//this.splitContainer1.Visible=false;
}
//设置文件菜单的打开项
privatestringUrl;//定义路径
privatevoid打开ToolStripMenuItem_Click_1(objectsender,EventArgse)
{
Url=@"c:
\";
openFileDialog1.InitialDirectory=Url;
stringfilter="文本文件(*.txt)|*.txt";
openFileDialog1.Filter=filter;
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
Form2frm=newForm2();
frm.Text=openFileDialog1.FileName;
StreamReadersr=newStreamReader(openFileDialog1.OpenFile());
frm.rtb.Text=sr.ReadToEnd();
frm.MdiParent=this;
frm.Show();
}
}
//定义保存方法
publicvoidSavefile()
{/*********************/
if(this.MdiChildren.Length==0)
{
return;
}
else
{/********************/
//RichTextBoxrichTextBox1=(RichTextBox)ActiveMdiChild.ActiveControl;
Form2frm=(Form2)ActiveMdiChild;
this.f2=frm;
saveFileDialog1.Filter="文本文件(*.txt)|*.txt";
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{
this.f2.Text=saveFileDialog1.FileName;
try
{
//childtxt.TextIsChange=false;//如果已经保存,则当前childtxt可以直接退出
this.f2.rtb.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
//child_Form.MdiParent=this;
}
catch
{
stringMessage="CannotOpen"+saveFileDialog1.FileName;
MessageBox.Show(Message,"保存文件错误",MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
}
}
}
//设置文件菜单的保存项
privatevoid保存ToolStripMenuItem_Click(objectsender,EventArgse)
{
Savefile();
}
//设置文件菜单的另存为项
privatevoid另存为ToolStripMenuItem_Click(objectsender,EventArgse)
{
Savefile();
}
//设置文件菜单的退出项
privatevoid退出ToolStripMenuItem_Click(objectsender,EventArgse)
{
DialogResultresult;
result=MessageBox.Show("退出前是否保存","退出",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question);
if(result==DialogResult.No)
this.Close();
elseif(result==DialogResult.Yes)
{
Form2frm=newForm2();
saveFileDialog1.ShowDialog();
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{
frm.rtb.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}
}
}
//设置窗口菜单的关于子菜单的排列方式:
层叠、垂直、水平
privatevoid层叠窗口cToolStripMenuItem_Click_1(objectsender,EventArgse)
{
this.LayoutMdi(MdiLayout.Cascade);
}
privatevoid垂直平铺VToolStripMenuItem_Click(objectsender,EventArgse)
{
this.LayoutMdi(MdiLayout.TileVertical);
}
privatevoid水平平铺TToolStripMenuItem_Click(objectsender,EventArgse)
{
this.LayoutMdi(MdiLayout.TileHorizontal);
}
//帮助菜单,打开关于记事本
privatevoid关于记事本AToolStripMenuItem_Click(objectsender,EventArgse)
{
Form3hp=newForm3();
hp.ShowDialog();
}
}
}
//子窗体部分源代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceWrittenBoard_finally_
{
publicpartialclassForm2:
Form
{
publicForm2()
{
InitializeComponent();
}
//定义初始字体字号
intfontsize=16;
stringfontStyle="宋体";
privatevoidrtb_TextChanged_1(objectsender,EventArgse)
{
this.rtb.Dock=DockStyle.Fill;
}
//设置打开菜单项
privatevoid打开ToolStripMenuItem_Click_1(objectsender,EventArgse)
{
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
this.rtb.LoadFile(openFileDialog1.FileName,RichTextBoxStreamType.PlainText);
Url=openFileDialog1.FileName;
}
}
//设置子窗体form_load事件
privatevoidForm2_Load_1(objectsender,EventArgse)
{
this.Text="新建文本文档";
this.复制ToolStripMenuItem.Enabled=false;
this.剪切ToolStripMenuItem1.Enabled=false;
foreach(FontFamilyfontinFontFamily.Families)
this.fontCB.Items.Add(font.Name);//设置fontCB下拉菜单内容
this.fontCB.SelectedItem="宋体";//设置fontCB显示内容
foreach(stringnamein