C多文本编辑器考试报告
更新时间:2023-08-18 09:45:01 阅读量: 资格考试认证 文档下载
XX大学C#.NET
课程考试
一、题目:多文本编辑器的设计
二、设计要求:
用C# 的可视化环境通过制作一个 RichTextBox 这样一个文本编辑器,熟悉在可视化环境下编程,并且学会使用里面提供的一些组装好的一些工具,
三、设计思路及代码:
第一是:新建一个RichTextBox ,然后我最先想到的就是遨游里的选项卡非常好用而且人性化,怎么制作这样一个选项卡,怎么把 RichTextBox 放到里面,我就了解了 TabControl 工具并且最先想到的是用 RichTextBox 数组,每个选项卡分配一个 RichTextBox[i] ,但是当关闭选项卡时就遇到问题了,不知道选项卡最后对应的是哪一个 RichTextBox[i] ,然后就想出了把RichTextBox封装在选项卡里的想法,为了记录文件路径和文件是不是已经保存的状态,我顺便封装两个 Label 进去,因为要用到他们的 text() 属性记录这些信息,我们只对当前选项卡操作,首先用foreach语句获取选项卡里的控件类型,再进行相应操作。这样最后解决了窗口关闭问题,以及新建窗口个数有限性的问题,我的这个程序理论上是可以新建无数多个窗口的,就看你内存如何了。代码如下:(文件打开的功能也差不多)
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str = "NewText" + (NF++);//获取选项卡名字
tabControl1.TabPages.Add(str);//增加选项卡
tabControl1.SelectTab(m++);//当前页转到下一页
tabControl1.TabStop = true;//允许tab键顺序
RichTextBox r= new RichTextBox();
r.ContextMenuStrip = contextMenuStrip2;//增加右键菜单
r.TextChanged += new EventHandler(Form1_TextChanged);//文本内容发生改变时执行的函数
r.Dock = System.Windows.Forms.DockStyle.Fill;
r.Location = new System.Drawing.Point(0, 0);
Label l1 = new Label();
l1.Text = str;//保存路径
Label l2 = new Label();
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(object sender, EventArgs e) :
void Form1_TextChanged(object sender, EventArgs e) toolStripButton3.Enabled = true; { 保存SToolStripMenuItem.Enabled = true;
} //获得控件 r 、l1 、l2 (第十设计思路)
if (l2.Text == "已保存" || l2.Text == "打开") else if (l2.Text == "打开1")
{ {
l2.Text = "未保存"; v++; l2.Text = "打开";
toolStripButton3.Enabled = false;
保存SToolStripMenuItem.Enabled = false;
}
else
{ toolStripButton3.Enabled = true;
保存SToolStripMenuItem.Enabled = true;
}
}
第三是:当选项卡相互切换时,也有一些事情要处理的,比如说在一个选项卡里未保存文本,保存按钮需要保持可用状态,但是当切换到另一个选项卡时可能它是已经保存的,保存按钮继续保持不可用状态,这需要一些判断和处理,当然还有其他一些操作:
private void target(object sender, EventArgs e)//窗口切换
{
//获得选项卡里的控件,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();
else l1.Show();
if (隐藏保存提示栏ToolStripMenuItem.Checked == true) l2.Hide();
else l2.Show();
}
}
第四是:当选项卡关闭时也有一些处理,比如说文本没有保存的话要给用户一个保存修改的机会,要实现像遨游那样双击可以关闭,我设置了双击函数,并且选项卡的右键菜单的关闭选项的处理也直接使用这个双击函数,主要实现关闭选项卡的功能,但是为了使用户操作,我至少要有一个选项卡留在窗口不能关闭,所以最后一个选项卡不能关闭的:
void tabControl1_DoubleClick(object sender, EventArgs e)
{
//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if (m > 1)
{//当窗口数量 m > 1 时才执行关闭功能
if (l2.Text == "已保存" || l2.Text == "打开")
{ tabControl1.SelectedTab.Dispose(); m--; }
else { string message, title; DialogResult result;//文本需要保存时要给出提示信息对话框
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--; } else if (result.ToString() == "No")
{ tabControl1.SelectedTab.Dispose(); m--; }
else { }
}//end else
}//end if (m > 1)
}
第五是:字体的设置,考虑要先获得所选文本的字体,要体现人性化智能化:(颜色的设置也差不多) private void 字体ToolStripMenuItem_Click(object sender, EventArgs e)
{
//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
f = new FontDialog(); f.ShowColor = true; f.ShowApply = true; //下面添加一个处理函数
f.Apply += new EventHandler(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;
}
void f_Apply(object sender, EventArgs e)
{//当字体对话框的应用按钮被按下时发生
//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
r.SelectionFont = f.Font; r.SelectionColor = f.Color; r.Focus();
}
第六是:查找对话框的制作,说了这个其实替换对话框就不要说了:
private void findFun1(object sender, EventArgs e)
{ //执行向下查找的功能,fs=0表示没有选择文本,否则选择了文本
//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if (r.SelectedText.Length == 0) fs = 0; string str1 = 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();
}
private void findFun2(object sender, EventArgs e) //执行向上查找的功能,fs=0表示没有选择文本 { //获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
int q, n,l; if (r.SelectedText.Length == 0) fs = 0; string str1 = find.textBox1.Text;
if (str1.Length == 0) return; start = r.SelectionStart; q = 0; l = 0; n = -1;
while (n < start)
{ 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; }
else r.SelectionStart = q; r.Focus();
}//函数结束
private void findClose(object sender, EventArgs e)
{//执行关闭查找对话框的功能,有些数据需要重置
fc = 0; 查找下一个NToolStripMenuItem.Enabled = false; find.Close();
}
private void 查找FToolStripMenuItem_Click(object sender, EventArgs e)
{
if (fc == 1) find.Close(); find=new Form2(); fc = 1; //查找对话框的数目为 1
//如果已经存在查找对话框则关闭前一个,永远保持只有一个对话框给用户操作
查找下一个NToolStripMenuItem.Enabled = true; find.button3.Click += new EventHandler(findFun1); find.button2.Click += new EventHandler(findFun2);//添加查找对话框按钮的处理函数,在上面 find.button1.Click += new EventHandler(findClose); find.Show();
}
第七是:获得系统时间 -> r.SelectedText = DateTime.Now.ToString();
第八是:保存文件,另存为,这里列举保存的代码:
private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
{
//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if (l2 != null)
{
if (l2.Text == "新建")//比较特殊,因为没有保存路径所以需要与用户进行对话
{ SaveFileDialog save = new SaveFileDialog(); 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);
}
}
else if (l2.Text == "未保存")
{ r.SaveFile(l1.Text); l2.Text = "已保存"; v--; }
if (l2.Text == "打开") { 2.Text = "已保存"; }
} toolStripButton3.Enabled = false; 保存SToolStripMenuItem.Enabled = false;//保存按钮不可用 }
第九是:退出程序时的处理:(没有保存的文件需要和用户进行对话,确定保存与否)
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (v > 0) //其中 v 是未保存文本的记数数量,有未保存的文本需要和用户取得对话
{ string message, title; DialogResult result; title = "提醒你"; icon = MessageBoxIcon.Warning; message = "窗口正在关闭 \n\n但是文本未被全部保存 !\n\n是不是全部执行保存?";
button = MessageBoxButtons.YesNoCancel; result = MessageBox.Show(message, title, button, icon); if (result.ToString() == "Yes")
{ for (int count = 0; count < m;count++ )
{ RichTextBox r = null; Label l1 = null, l2 = null; tabControl1.SelectedIndex = count;
//获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏
if (l2 != null && (l2.Text == "未保存" || l2.Text == "新建"))
{ 保存SToolStripMenuItem_Click(sender, e); }
}//end for
this.Close();
}//end result.ToString() == "Yes"
else if (result.ToString() == "No")
{ this.Close(); }// end result.ToString() == "No"
else { } //取消动作
}//end if (v > 0)
else { this.Close(); }//如果没有未保存的文本则直接关闭不需要提醒用户
}
第十是:获得选项卡里的控件,r为RichTextBox,l1为路径栏,l2为保存提示栏,这样就差不多解决了整个程序了,因为程序的基本框架已经呈现了:
RichTextBox r = null;
Label l1 = null, l2 = null;
foreach (Control c in tabControl1.SelectedTab.Controls)
{
if (c is RichTextBox)
{
r = (RichTextBox)c;
}
if (c is Label)
{
if (l1 == null) l1 = (Label)c;
else if (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; 第十三是:变量的说明:(定义了几个全局变量下面分别说明)
int NF = 1,m=0,v=0;// NF是记数新建文件的次数,只加不减,m 是选项卡个数,动态变化
// v 是需要进行保存的选项卡个数,也是动态变化的一个值
private MessageBoxButtons button;//退出时提示对话框的按钮风格
private MessageBoxIcon icon; //退出时提示对话框的图标风格
FontDialog f; //字体对话框,因为两个函数共用它所以设为全局变量
Form2 find; int start=0 , fc = 0,fs=0;
//查找对话框,start 是被选择的文本在 RichTextBox 中的位置,
// fc 是在工作中查找对话框的个数 ,fs=0表示没有选择文本,否则选择了文本
Form3 tiH = null;
//替换对话框
四、实验效果图:
1、选项卡可以双击关闭,也可以在右键菜单里选择关闭选项来关闭, 如图:
2、字体设置,弹出的对话框自动获得字体的属性,并显示,而且实现应用功能:
3、颜色对话框的设置和字体对话框差不多,都是能自动获得所选择字体的颜色并在对话框里体现:
4、主题是改变背景色,在格式里选择主题,定义背景色:
5、查找对话框实现了界面置顶,当查找到文本头或尾时将提示并不循环查找元素:
6、替换对话框也设置了置顶功能,不过在出现提示“替换完毕!”时会暂时失去置顶效果,这是界面的要求:
强实验,继续熟悉 C# 可视化编程的环境和功能,以及工具的调用。
正在阅读:
C多文本编辑器考试报告08-18
大工12秋《软件工程》在线作业106-12
灏忓?鍥涘勾绾у簲鐢ㄩ?100閬12-19
边缘叶癫痫持续状态05-30
2016安徽政法干警面试热点:高中收“辛苦费”是怎样一种混账逻辑12-27
岭南版小学二年级下册美术教案12-05
神奇的新年礼物作文240字06-14
40000吨年综合治理尼龙废弃物环03-07
2022年继续教育研修自我鉴定04-16
起名风波作文800字07-07
- 资料分析模拟题七
- 2012福建公务员考试模拟试题资料总汇
- 公务员考试《申论》模拟题24及答案
- 2014国家公务员考试:行测模拟题之资料分析(10.10)
- 黑龙江公务员考试模拟试题及答案:资料分析部分(第二套)
- 湖南省公务员考试模拟试题行测及答案:资料分析部分(第二套)
- 2014年广西公务员考试行测言语理解数量关系资料分析常识模拟试题
- 江西公务员考试模拟试题及答案:资料分析部分(第三套)
- 2011年辽宁省公务员考试申论综合分析模拟试题四
- 2013年安徽省公务员考试行测资料分析模拟试题五
- 2012年国家公务员考试申论模拟题:食品安全
- 《公共基础知识》模拟试题(2)
- 公务员考试行测逻辑推理模拟试题十三
- 2013申论模拟题-防止地球污染
- 2013年四川省公务员考试《申论》模拟试卷
- 福建省公务员考试模拟试题及答案:资料分析部分(第一套)
- 国家公务员招录考试申论模拟试题(一)及参考答案
- 湖南省公务员考试模拟试题及答案:资料分析部分(第一套)
- 建筑材料模拟试题1
- 2014国家公务员考试-行测模拟题之资料分析(9.26)
- 编辑器
- 文本
- 报告
- 考试
- 生活中如何防癌,抗癌
- 建筑施工合同
- 教师教学工作手册
- 药品质量检测
- 小学生六年级作文大年三十
- 酸性 碱性食物详解
- 通信考研排名
- 2014年中级公路运输专业知识:道路运输价格及其形成
- Sprite Kit编程指南
- 四川省自贡市贡井区成佳中学校2020-2021学年七年级上学期第一次月考数学试题(无答案)
- 述职2014团青工作总结暨2015工作计划
- 复旦大学MBA2015年分数线公布
- 2014山西信息技术会考模拟题
- 小学中高段课外阅读开题报告
- 第6单元_表内乘法(二)8的乘法口诀_例3解决问题_2013年秋新人教版二年级数学上册
- 关于学校档案管理工作存在的问题及应对措施
- 新课标数学选修4-5柯西不等式教学题库大全
- 物流成本计算方法
- 中学生禁毒教育宣传资料
- 《孙子兵法》对新世纪企业战略的价值