C多文本编辑器考试报告
更新时间:2023-06-11 13:07: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多文本编辑器考试报告06-11
元旦的习俗和由来作文300字06-13
家乡的溪滩作文600字07-13
安全生产文明施工管理制度03-14
宝岛验光流程09-25
我最喜欢的一幅画作文500字06-19
最新部编版语文四年级下册全册单元复习课教案(共8单元)-部编四下03-21
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 编辑器
- 文本
- 报告
- 考试