C多文本编辑器考试.docx
《C多文本编辑器考试.docx》由会员分享,可在线阅读,更多相关《C多文本编辑器考试.docx(21页珍藏版)》请在冰豆网上搜索。
C多文本编辑器考试
XX大学C#.NET
课程考试
设计题目
多文本编辑器的设计
起止日期
2008-2009学年第1学期
课程名称
C#.NET语言程序设计
设计成员及各自的工作说明
院系计算机系班级
人员组成及各自工作说明:
学号
姓名
主要工作说明
成绩
整个程序的设计及完成
设计内容
综合运用VisualC#.NET提供的标准控件,模仿Windows中的记事本和写字板的功能,自己设计一个多文档编辑工具。
评
语
与
成
绩
项目/成绩
优
良
中
及格
不及格
系统分析设计
□
□
□
□
□
程序设计水平
□
□
□
□
□
内容完成情况
□
□
□
□
□
设计报告撰写质量
□
□
□
□
□
课程设计总结情况
□
□
□
□
□
附加说明:
综合成绩:
指导教师
年月日
一、题目:
多文本编辑器的设计
二、设计要求:
用C#的可视化环境通过制作一个RichTextBox这样一个文本编辑器,熟悉在可视化环境下编程,并且学会使用里面提供的一些组装好的一些工具,
三、设计思路及代码:
第一是:
新建一个RichTextBox,然后我最先想到的就是遨游里的选项卡非常好用而且人性化,怎么制作这样一个选项卡,怎么把RichTextBox放到里面,我就了解了TabControl工具并且最先想到的是用RichTextBox数组,每个选项卡分配一个RichTextBox[i],但是当关闭选项卡时就遇到问题了,不知道选项卡最后对应的是哪一个RichTextBox[i],然后就想出了把RichTextBox封装在选项卡里的想法,为了记录文件路径和文件是不是已经保存的状态,我顺便封装两个Label进去,因为要用到他们的text()属性记录这些信息,我们只对当前选项卡操作,首先用foreach语句获取选项卡里的控件类型,再进行相应操作。
这样最后解决了窗口关闭问题,以及新建窗口个数有限性的问题,我的这个程序理论上是可以新建无数多个窗口的,就看你内存如何了。
代码如下:
(文件打开的功能也差不多)
privatevoid新建ToolStripMenuItem_Click(objectsender,EventArgse)
{
stringstr="NewText"+(NF++);//获取选项卡名字
tabControl1.TabPages.Add(str);//增加选项卡
tabControl1.SelectTab(m++);//当前页转到下一页
tabControl1.TabStop=true;//允许tab键顺序
RichTextBoxr=newRichTextBox();
r.ContextMenuStrip=contextMenuStrip2;//增加右键菜单
r.TextChanged+=newEventHandler(Form1_TextChanged);//文本内容发生改变时执行的函数
r.Dock=System.Windows.Forms.DockStyle.Fill;
r.Location=newSystem.Drawing.Point(0,0);
Labell1=newLabel();
l1.Text=str;//保存路径
Labell2=newLabel();
l2.Text="新建";v++;//保存文件是不是保存的状态
l1.Dock=System.Windows.Forms.DockStyle.Bottom;
l2.Dock=System.Windows.Forms.DockStyle.Bottom;
tabControl1.SelectedTab.Controls.Add(r);
tabControl1.SelectedTab.Controls.Add(l1);
tabControl1.SelectedTab.Controls.Add(l2);//封装进去,注意句柄丢了,这样做到与选项卡一一对应。
……
}
第二是:
当RichTextBox的文本改变时,要改变文本是否保存的状态,这要给RichTextBox添加一个TextChanged处理函数Form1_TextChanged(objectsender,EventArgse):
voidForm1_TextChanged(objectsender,EventArgse)
{
……//获得控件r、l1、l2(第十设计思路)
if(l2.Text=="已保存"||l2.Text=="打开")
{
l2.Text="未保存";v++;
toolStripButton3.Enabled=true;
保存SToolStripMenuItem.Enabled=true;
}
elseif(l2.Text=="打开1")
{
l2.Text="打开";
toolStripButton3.Enabled=false;
保存SToolStripMenuItem.Enabled=false;
}
else
{toolStripButton3.Enabled=true;
保存SToolStripMenuItem.Enabled=true;
}
}
第三是:
当选项卡相互切换时,也有一些事情要处理的,比如说在一个选项卡里未保存文本,保存按钮需要保持可用状态,但是当切换到另一个选项卡时可能它是已经保存的,保存按钮继续保持不可用状态,这需要一些判断和处理,当然还有其他一些操作:
privatevoidtarget(objectsender,EventArgse)//窗口切换
{
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if(l2!
=null)
{
if(l2.Text=="已保存"||l2.Text=="打开")
{
保存SToolStripMenuItem.Enabled=false;
toolStripButton3.Enabled=false;
}
else
{
保存SToolStripMenuItem.Enabled=true;
toolStripButton3.Enabled=true;
}
if(fc>0)查找下一个NToolStripMenuItem.Enabled=true;
else查找下一个NToolStripMenuItem.Enabled=false;
if(r.CanUndo)撤消ToolStripMenuItem.Enabled=true;
else撤消ToolStripMenuItem.Enabled=false;
}
if(l1!
=null&&l2!
=null)
{
if(隐藏路径ToolStripMenuItem.Checked==true)l1.Hide();
elsel1.Show();
if(隐藏保存提示栏ToolStripMenuItem.Checked==true)l2.Hide();
elsel2.Show();
}
}
第四是:
当选项卡关闭时也有一些处理,比如说文本没有保存的话要给用户一个保存修改的机会,要实现像遨游那样双击可以关闭,我设置了双击函数,并且选项卡的右键菜单的关闭选项的处理也直接使用这个双击函数,主要实现关闭选项卡的功能,但是为了使用户操作,我至少要有一个选项卡留在窗口不能关闭,所以最后一个选项卡不能关闭的:
voidtabControl1_DoubleClick(objectsender,EventArgse)
{
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if(m>1)
{//当窗口数量m>1时才执行关闭功能
if(l2.Text=="已保存"||l2.Text=="打开")
{tabControl1.SelectedTab.Dispose();m--;}
else{stringmessage,title;DialogResultresult;//文本需要保存时要给出提示信息对话框
message="窗口正在关闭……\n\n但是文本未被保存!
\n\n是不是执行保存?
";
title="提醒你";
button=MessageBoxButtons.YesNoCancel;
icon=MessageBoxIcon.Warning;
result=MessageBox.Show(message,title,button,icon);
if(result.ToString()=="Yes")
{保存SToolStripMenuItem_Click(sender,e);tabControl1.SelectedTab.Dispose();m--;}
elseif(result.ToString()=="No")
{tabControl1.SelectedTab.Dispose();m--;}
else{}
}//endelse
}//endif(m>1)
}
第五是:
字体的设置,考虑要先获得所选文本的字体,要体现人性化智能化:
(颜色的设置也差不多)
privatevoid字体ToolStripMenuItem_Click(objectsender,EventArgse)
{
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
f=newFontDialog();f.ShowColor=true;f.ShowApply=true;//下面添加一个处理函数
f.Apply+=newEventHandler(f_Apply);f.ScriptsOnly=true;f.ShowEffects=true;
f.ShowHelp=true;f.AllowVerticalFonts=true;f.Color=r.SelectionColor;f.Font=r.SelectionFont;
f.ShowDialog();r.SelectionFont=f.Font;r.SelectionColor=f.Color;
}
voidf_Apply(objectsender,EventArgse)
{//当字体对话框的应用按钮被按下时发生
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
r.SelectionFont=f.Font;r.SelectionColor=f.Color;r.Focus();
}
第六是:
查找对话框的制作,说了这个其实替换对话框就不要说了:
privatevoidfindFun1(objectsender,EventArgse)
{//执行向下查找的功能,fs=0表示没有选择文本,否则选择了文本
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if(r.SelectedText.Length==0)fs=0;stringstr1=find.textBox1.Text;if(str1.Length==0)return;
if(fs==0){start=r.SelectionStart-1;fs=1;}
else{start=r.SelectionStart;}
if(start==r.Text.Length-1)start--;start=r.Find(str1,start+1,RichTextBoxFinds.MatchCase);
f(start==-1)
{MessageBox.Show("已查找到文档的结尾!
","查找结束对话框");}
else{fs=1;}
r.Focus();
}
privatevoidfindFun2(objectsender,EventArgse)//执行向上查找的功能,fs=0表示没有选择文本
{……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
intq,n,l;if(r.SelectedText.Length==0)fs=0;stringstr1=find.textBox1.Text;
if(str1.Length==0)return;start=r.SelectionStart;q=0;l=0;n=-1;
while(n{if(fs>0&&n>=0)q=n;else{q=start;l--;}n=r.Find(str1,n+1,RichTextBoxFinds.MatchCase);
if(n>=start&&fs==0){r.SelectionLength=0;l--;}if(r.TextLength==0){l--;break;}fs=1;l++;
if(start==0)l=0;if(n==-1)break;
}
if(l<1)
{MessageBox.Show("已查找到文档的开头!
","查找结束对话框");r.SelectionStart=start;}
elser.SelectionStart=q;r.Focus();
}//函数结束
privatevoidfindClose(objectsender,EventArgse)
{//执行关闭查找对话框的功能,有些数据需要重置
fc=0;查找下一个NToolStripMenuItem.Enabled=false;find.Close();
}
privatevoid查找FToolStripMenuItem_Click(objectsender,EventArgse)
{
if(fc==1)find.Close();find=newForm2();fc=1;//查找对话框的数目为1
//如果已经存在查找对话框则关闭前一个,永远保持只有一个对话框给用户操作
查找下一个NToolStripMenuItem.Enabled=true;find.button3.Click+=newEventHandler(findFun1);
find.button2.Click+=newEventHandler(findFun2);//添加查找对话框按钮的处理函数,在上面
find.button1.Click+=newEventHandler(findClose);find.Show();
}
第七是:
获得系统时间->r.SelectedText=DateTime.Now.ToString();
第八是:
保存文件,另存为,这里列举保存的代码:
privatevoid保存SToolStripMenuItem_Click(objectsender,EventArgse)
{
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if(l2!
=null)
{
if(l2.Text=="新建")//比较特殊,因为没有保存路径所以需要与用户进行对话
{SaveFileDialogsave=newSaveFileDialog();save.DefaultExt="*.rtf";save.Filter="*.rtf|*.rtf";
if(save.ShowDialog()==DialogResult.OK&&save.FileName.Length>0)
{
r.SaveFile(save.FileName);l2.Text="已保存";v--;l1.Text=save.FileName;
tabControl1.SelectedTab.Text=System.IO.Path.GetFileName(save.FileName);
}
}
elseif(l2.Text=="未保存")
{r.SaveFile(l1.Text);l2.Text="已保存";v--;}
if(l2.Text=="打开"){2.Text="已保存";}
}toolStripButton3.Enabled=false;保存SToolStripMenuItem.Enabled=false;//保存按钮不可用
}
第九是:
退出程序时的处理:
(没有保存的文件需要和用户进行对话,确定保存与否)
privatevoid退出ToolStripMenuItem_Click(objectsender,EventArgse)
{
if(v>0)//其中v是未保存文本的记数数量,有未保存的文本需要和用户取得对话
{stringmessage,title;DialogResultresult;title="提醒你";icon=MessageBoxIcon.Warning;
message="窗口正在关闭……\n\n但是文本未被全部保存!
\n\n是不是全部执行保存?
";
button=MessageBoxButtons.YesNoCancel;result=MessageBox.Show(message,title,button,icon);
if(result.ToString()=="Yes")
{for(intcount=0;count{RichTextBoxr=null;Labell1=null,l2=null;tabControl1.SelectedIndex=count;
……//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if(l2!
=null&&(l2.Text=="未保存"||l2.Text=="新建"))
{保存SToolStripMenuItem_Click(sender,e);}
}//endfor
this.Close();
}//endresult.ToString()=="Yes"
elseif(result.ToString()=="No")
{this.Close();}//endresult.ToString()=="No"
else{}//取消动作
}//endif(v>0)
else{this.Close();}//如果没有未保存的文本则直接关闭不需要提醒用户
}
第十是:
获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏,这样就差不多解决了整个程序了,因为程序的基本框架已经呈现了:
RichTextBoxr=null;
Labell1=null,l2=null;
foreach(ControlcintabControl1.SelectedTab.Controls)
{
if(cisRichTextBox)
{
r=(RichTextBox)c;
}
if(cisLabel)
{
if(l1==null)l1=(Label)c;
elseif(l2==null)l2=(Label)c;
}
}
第十一是:
获得绝对路径下的文件名,save.FileName是绝对路径:
tabControl1.SelectedTab.Text=System.IO.Path.GetFileName(save.FileName);
第十二是:
当按钮可用时要设置为true属性:
(否则设为flase)
另存为AToolStripMenuItem.Enabled=true;
剪切TToolStripMenuItem.Enabled=true;复制CToolStripMenuItem.Enabled=true;
删除ToolStripMenuItem.Enabled=true;查找FToolStripMenuItem.Enabled=true;
替换ToolStripMenuItem.Enabled=true;转到ToolStripMenuItem.Enabled=true;
全选ToolStripMenuItem.Enabled=true;时间与日期ToolStripMenuItem.Enabled=true;
字体ToolStripMenuItem.Enabled=true;段落ToolStripMenuItem.Enabled=true;
主题HToolStripMenuItem.Enabled=true;颜色AToolStripMenuItem.Enabled=true;
toolStripButton4.Enabled=true;toolStripButton5.Enabled=true;toolStripButton7.Enabled=true;
toolStripButton8.Enabled=true;toolStripButton9.Enabled=true;toolStripButton10.Enabled=true;
第十三是:
变量的说明:
(定义了几个全局变量下面分别说明)
intNF=1,m=0,v=0;//NF是记数新建文件的次数,只加不减,m是选项卡个数,动态变化
//v是需要进行保存的选项卡个数,也是动态变化的一个值
privateMessageBoxButtonsbutton;//退出时提示对话框的按钮风格
privateMessageBoxIconicon;//退出时提示对话框的图标风格
FontDialogf;//字体对话框,因为两个函数共用它所以设为全局变量
Form2