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# 可视化编程的环境和功能,以及工具的调用。

本文来源:https://www.bwwdw.com/article/38o1.html

Top