2022年C多文本编辑器考试.docx
精品学习资源XX 高校C#.NET课程考试设计题目多文本编辑器的设计起止日期2021-2021 学年第 1学期课程名称C#.NET 语言程序设计院系运算机系班级人员组成及各自工作说明 :学号姓名主要工作说明成果整个程序的设计及完成设计成员及各自的工作说明设计内容综合运用 Visual C#.NET 供应的标准控件,仿照Windows中的记事本和写字板的功能,自己设计一个多文档编辑工具;工程/ 成果优良中及格不及格评系统分析设计 程序设计水平语内容完成情形 与设计报告撰写质量 课程设计总结情形成附加说明:绩综合成果 : 指导老师年月日1 / 13欢迎下载精品学习资源一、题目:多文本编辑器的设计二、设计要求:用C# 的可视化环境通过制作一个RichTextBox这样一个文本编辑器,熟识在可视化环境下编程,并且学会使用里面供应的一些组装好的一些工具,三、设计思路及代码:第一是:新建一个 RichTextBox ,然后我最先想到的就是漫游里的选项卡特殊好用而且人性化,怎么制作这样一个选项卡, 怎么把 RichTextBox放到里面, 我就明白了 TabControl工具并且最先想到的是用 RichTextBox数组,每个选项卡支配一个RichTextBoxi,但是当关闭选项卡时就遇到问题了,不 知道选项卡最终对应的是哪一个RichTextBoxi,然后就想出了把 RichTextBox 封装在选项卡里的想法,为了记录文件路径和文件是不是已经储存的状态,我顺便封装两个Label进去,由于要用到他们的text属性记录这些信息,我们只对当前选项卡操作,第一用foreach语句猎取选项卡里的控件类型,再进行相应操作;这样最终解决了窗口关闭问题,以及新建窗口个数有限性的问题,我的这个程序理论上是可以新建很多多个窗口的,就看你内存如何了;代码如下:(文件打开的功能也差不多)private void新建 ToolStripMenuItem_Clickobject sender, EventArgs estring str = "NewText" + NF+;/猎取选项卡名字tabControl1.TabPages.Addstr ;/增加选项卡tabControl1.SelectTabm+ ;/当前页转到下一页tabControl1.TabStop = true ;/ 答应tab键次序RichTextBoxr= new RichTextBox ;r.ContextMenuStrip = contextMenuStrip2;/增加右键菜单r.TextChanged += new EventHandlerForm1_TextChanged;/文本内容发生转变时执行的函数r.Dock = System.Windows.Forms.DockStyle.Fill;r.Location = new System.Drawing.Point0, 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.Addr ;tabControl1.SelectedTab.Controls.Addl1;tabControl1.SelectedTab.Controls.Addl2;/ 封装进去,留意句柄丢了,这样做到与选项卡一一对应;其次是:当 RichTextBox的文本转变时,要转变文本是否储存的状态,这要给RichTextBox添加一个 TextChanged处理函数 Form1_TextChangedobject sender, EventArgs e:欢迎下载精品学习资源void Form1_TextChangedobject sender, EventArgs e /获得控件 r 、l1 、l2 (第十设计思路)if l2.Text = " 已储存 " | l2.Text = " 打开 "true;toolStripButton3.Enabled = true ;保 存 SToolStripMenuItem.Enabled=欢迎下载精品学习资源l2.Text = " 未储存 "; v+ ;2 / 13else if l2.Text = " 打开 1"欢迎下载精品学习资源false;l2.Text = " 打开" ;toolStripButton3.Enabled = false ;保存SToolStripMenuItem.Enabled=欢迎下载精品学习资源true;elsetoolStripButton3.Enabled = true;保 存 SToolStripMenuItem.Enabled=欢迎下载精品学习资源3 / 13欢迎下载精品学习资源第三是:当选项卡相互切换时,也有一些事情要处理的,比如说在一个选项卡里未储存文本,储存按钮需要保持可用状态,但是当切换到另一个选项卡时可能它是已经储存的,储存按钮连续保持不行用状态, 这需要一些判定和处理,当然仍有其他一些操作:private void targetobject sender, EventArgs e/ 窗口切换 / 获得选项卡里的控件, r 为RichTextBox , l1为路径栏, l2为储存提示栏if l2 .= nullif l2.Text = " 已储存 " | l2.Text = " 打开 "欢迎下载精品学习资源else储存 SToolStripMenuItem.Enabled = false ;toolStripButton3.Enabled = false ;储存 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 ;ifl1.=null&&l2.=nullif 隐匿路径 ToolStripMenuItem.Checked = true l1.Hide;else l1.Show ;if 隐匿储存提示栏 ToolStripMenuItem.Checked = true l2.Hide;else l2.Show ;第四是:当选项卡关闭时也有一些处理,比如说文本没有储存的话要给用户一个储存修改的机会,要实现像漫游那样双击可以关闭,我设置了双击函数,并且选项卡的右键菜单的关闭选项的处理也直接使用这个双击函数,主要实现关闭选项卡的功能,但是为了使用户操作,我至少要有一个选项卡留在窗口不能关闭,所以最终一个选项卡不能关闭的:void tabControl1_DoubleClickobject sender, EventArgs e / 获得选项卡里的控件, r 为RichTextBox , l1为路径栏, l2为储存提示栏if m > 1/ 当窗口数量m > 1 时才执行关闭功能if l2.Text = " 已储存 " | l2.Text = " 打开"tabControl1.SelectedTab.Dispose ;m- ;elsestring message, title ;DialogResult result ;/文本需要储存时要给出提示信息对话框message = "窗口正在关闭nn但是文本未被储存! nn是不是执行储存 .";title = " 提示你 ";button = MessageBoxButtons.YesNoCancel ;icon = MessageBoxIcon.Warning ;4 / 13欢迎下载精品学习资源else result = MessageBox.Showmessage, title, button, icon ;if result.ToString = "Yes"储存 SToolStripMenuItem_Clicksender, e; tabControl1.SelectedTab.Dispose ;m-; else if result.ToString = "No"tabControl1.SelectedTab.Dispose ;m- ;/end else欢迎下载精品学习资源/end if m > 1第五是:字体的设置,考虑要先获得所选文本的字体,要表达人性化智能化:(颜色的设置也差不多)private void字体 ToolStripMenuItem_Clickobject sender, EventArgs e / 获得选项卡里的控件, r 为RichTextBox , l1为路径栏, l2为储存提示栏f = new FontDialog ;f.ShowColor = true ;f.ShowApply = true ; /下面添加一个处理函数f.Apply += new EventHandlerf_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_Applyobject sender, EventArgs e/ 当字体对话框的应用按钮被按下时发生 / 获得选项卡里的控件, r 为RichTextBox , l1为路径栏, l2为储存提示栏r.SelectionFont = f.Font ;r.SelectionColor = f.Color ; r.Focus;第六是:查找对话框的制作,说了这个其实替换对话框就不要说了:private void findFun1object 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.Findstr1, start + 1, RichTextBoxFinds.MatchCase;f start = -1MessageBox.Show"已查找到文档的结尾.", " 查找终止对话框 "; elsefs = 1 ;r.Focus;private void findFun2object 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 < startiffs>0&&n>=0q=n ; elseq=start ;l- ;n=r.Findstr1,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 ;5 / 13欢迎下载精品学习资源if l < 1 MessageBox.Show"已查找到文档的开头 . ", " 查找终止对话框"; r.SelectionStart = start ; else r.SelectionStart = q ;r.Focus;/ 函数终止private void findCloseobject sender, EventArgs e/ 执行关闭查找对话框的功能,有些数据需要重置fc = 0 ;查找下一个 NToolStripMenuItem.Enabled = false; find.Close ;private void查找 FToolStripMenuItem_Clickobject sender, EventArgs eif fc = 1 find.Close;find=new Form2 ;fc = 1 ; /查找对话框的数目为1/ 假如已经存在查找对话框就关闭前一个,永久保持只有一个对话框给用户操作查找下一个 NToolStripMenuItem.Enabled = true; find.button3.Click += new EventHandlerfindFun1;find.button2.Click += new EventHandlerfindFun2;/ 添加查找对话框按钮的处理函数,在上面find.button1.Click += new EventHandlerfindClose;find.Show ;第七是:获得系统时间->r.SelectedText = DateTime.Now.ToString;第八是:储存文件,另存为,这里列举储存的代码:private void储存 SToolStripMenuItem_Clickobject sender, EventArgs e / 获得选项卡里的控件, r 为RichTextBox , l1为路径栏, l2为储存提示栏if l2 .= nullif l2.Text = " 新建 "/ 比较特殊,由于没有储存路径所以需要与用户进行对话SaveFileDialog save = new SaveFileDialog;save.DefaultExt = "*.rtf";save.Filter = "*.rtf | *.rtf";if save.ShowDialog = DialogResult.OK && save.FileName.Length > 0r.SaveFilesave.FileName ; l2.Text = " 已储存 "; v- ; l1.Text = save.FileName ;tabControl1.SelectedTab.Text = System.IO.Path.GetFileNamesave.FileName;else if l2.Text = " 未储存 " r.SaveFilel1.Text ;l2.Text = " 已储存 "; v-; if l2.Text = " 打开 " 2.Text = " 已储存 " ; toolStripButton3.Enabled = false;储存SToolStripMenuItem.Enabled = false ;/储存按钮不行用第九是:退出程序时的处理:(没有储存的文件需要和用户进行对话,确定储存与否)private void退出 ToolStripMenuItem_Clickobject sender, EventArgs eif v > 0 / 其中 v是未储存文本的记数数量,有未储存的文本需要和用户取得对话string message, title ;DialogResult result ;title = " 提示你 ";icon = MessageBoxIcon.Warning ;message = "窗口正在关闭 nn但是文本未被全部储存! nn 是不是全部执行储存 ." ;button = MessageBoxButtons.YesNoCancel ;result = MessageBox.Showmessage, 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为储存提示栏6 / 13欢迎下载精品学习资源if l2 .= null && l2.Text = "未储存 " | l2.Text = " 新建"储存SToolStripMenuItem_Clicksender, e;/end forthis.Close ;/endresult.ToString = "Yes"else if result.ToString = "No"this.Close ;/endresult.ToString = "No" else / 取消动作/endif v > 0else this.Close ;/ 假如没有未储存的文本就直接关闭不需要提示用户第十是:获得选项卡里的控件,r为RichTextBox ,l1 为路径栏, l2为储存提示栏,这样就差不多解决了整个程序了,由于程序的基本框架已经显现了:RichTextBox r = null;Label l1 = null, l2 = null;foreach Control c in tabControl1.SelectedTab.Controlsif c is RichTextBoxr = RichTextBoxc ;if c is Labelif l1 = null l1 = Labelc;else if l2 = null l2 = Labelc;第十一是:获得确定路径下的文件名,save.FileName是确定路径:tabControl1.SelectedTab.Text = System.IO.Path.GetFileNamesave.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 ; / 字体对话框,由于两个函数共用它所以设为全局变量7 / 13欢迎下载精品学习资源Form2 find ; int start=0 , fc = 0,fs=0 ;/查找对话框, start 是被选择的文本在RichTextBox中的位置,/ fc是在工作中查找对话框的个数, fs=0表示没有选择文本,否就选择了文本Form3 tiH = null ;/替换对话框四、试验成效图:1、选项卡可以双击关闭,也可以在右键菜单里选择关闭选项来关闭,如图:2、字体设置,弹出的对话框自动获得字体的属性,并显示,而且实现应用功能:8 / 13欢迎下载精品学习资源3、颜色对话框的设置和字体对话框差不多,都是能自动获得所选择字体的颜色并在对话框里表达:9 / 13欢迎下载精品学习资源4、主题是转变背景色,在格式里选择主题,定义背景色:5、查找对话框实现了界面置顶,当查找到文本头或尾时将提示并不循环查找元素:10 / 13欢迎下载精品学习资源6、替换对话框也设置了置顶功能,不过在显现提示“替换完毕!”时会暂时失去置顶成效,这是界面的要求:11 / 13欢迎下载精品学习资源7、文本右键菜单实现了查看功能,可以隐匿工具栏路径栏储存提示的功能,其他是复用功能:五、试验总结:本次试验让我进一步熟识了c# 图形界面编程的工具的应用,进一步明白了各种工具的各种功能,仍学会了怎么自制一个对话框, 类似查找对话框, 并且实现子对话框和父对话框之间的数据通讯和值的返回,为此我可以自己DIY 自己宠爱的对话框模式了;我明白了RichTextBox的用法,我信任从不懂到懂是一个学习的过程是一个试验的过程,我仍增加了对tabControl和右键菜单的制作;对软件性能有了进一步的摸索,对面对对象技术进一步懂得并且认为这是特殊好的一种技术,曾经抽象的概念也慢慢在头脑里懂得清楚,比如我会把RichTextBox和 两个 Label 组合在一起装进tabControl增加的一个选项卡里, 封装在一起而不用管它是第几个选项卡里,所以没有用到RichTextBox数组,只要找到 tabControl选项卡然后才去看里面的RichTextBox,这样就把 RichTextBox让某个tabControl选项卡私有了, 别的 tabControl 选项卡是不能对此进行拜望的,虽然有很多项项卡,但是也确定不会拜望错RichTextBox,显现越权拜望,越界拜望的现象,没有用到数组的另一个好处是不会把窗口个数限定死了,例如不能超过100 个窗口等,由于数组总是有一个有限的长度,分多了怕铺张内存空间,分少了又怕不够用;但是我总觉得封装不完全,仍是有离散的感觉,这是面对对象的一种不是很成熟的模型,为什么说不成熟,是由于设计的仍不是最好的,我后来听老师说仍有更好的封装方法,但是我摸索良久却没有找出来,所以我对面对对象技术就更加崇拜了,对它的深奥增加了我学习的动力和爱好;本次试验对我来说是查找对话框的设计,第一是子对话框和父对话框的通讯问题,包括按钮的响应, 哪个监听哪个窗口的问题;后来解决了又遇到向上查找和向下查找的问题,由于没有供应向上查找的方法,我只能自己设计,而且当查找到文件头或者文件尾时要显现提示,不能往回头循环查找, 这样的付出是处理了一大堆的反常, 最终的成功也是最欣慰的;在设计的开头我以为RichTextBox支持图片插入,所以搞了个主题用来设置背景图片的,用到才发觉不能插入图片,只好用来转变背景颜色,这让我进一步熟识了RichTextBox的功能,以及它的限制,但是总的来说我觉得这个工具仍是很好用的,也很复杂,我做试验的时候用到的功能不及十几分之一,以后仍要加强学习,加12 / 13欢迎下载精品学习资源强试验,连续熟识C# 可视化编程的环境和功能,以及工具的调用;13 / 13欢迎下载