大一时课程设计《用C#编写的记事本》
主界面视图:
核心代码(含注释部分,大一时的作品,初学者,请多多包涵)
View Code
以下是课程设计说明书
河南中医学院 《C#程序设计》课程设计报告 文本编辑器 院系: 信息技术学院 专业: 信息管理与信息系统专业 班级: 2010级信管一班 姓名: 陈勇 指导教师: *** 完成日期: 2011年6月10日 设计题目:文本编辑器 1.题目描述 设计一个文本编辑器,能够实现对文本的编辑,窗体应有:文件,编辑,格式,查看,帮助。(模拟文本文档,添加部分word功能) 提供以下功能: 1.1文件操作能够实现:新建、打开、保存、另存为、页面属性、打印、打印预览、退出功能。 1.2编辑操作能够实现:撤销、剪切、复制、粘贴、删除、查找、转到、全选、时间/日期、替换功能。 1.3格式操作能够实现:自动换行、字体、颜色、背景颜色设置。 1.4查看操作能够实现:状态栏。 1.5 帮助操作能够实现:帮助主题、关于记事本。 另:(1)实现鼠标的右键常用功能,如复制、粘贴、剪切、撤销、全选、颜色。 (2)实现各功能的快捷键设置 (3)实现文本框的外观设置 2. 应用程序功能说明 新建:在未保存的情况下提示是否需要对文件进行保存 打开:打开已有的文件 保存:对文件进行保存,并显示保存的位置 另存为:和保存的功能基本相似 文件 页面属性:显示文本文档的页面属性 打印:实现对文本的打印功能 打印预览:打印前对打印效果的预览 退出:关闭打开的文本文档 撤销:撤除上一步操作 剪切:将选中的部分剪切掉 复制:复制选中的部分 粘贴:对剪切和复制的部分进行粘贴 编辑 删除:删除选中的部分 查找:实现单方向查找 全选:选中文本文档中的全部内容 时间/日期:在文本后加上时间 替换:对那些需要改变的内容实施替换和全部替换 自动换行:在一行写满之后,自动跳转到下一行 格式 字体:调用系统中自带的字体,实现对字体样式和大小的改变 颜色:调用系统中自带的颜色,实现对字体颜色的改变 背景颜色:在给定的几种颜色中选一种作为背景颜色 查看 状态栏:显示当前输入文本的字数和年/月/日 帮助主题:显示帮助部分 帮助 关于记事本:版权的说明 客户反馈:对客户的满意程度实施调查 3. 源程序 3.1 Form1部分源代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO;//调用命名空间 using System.Drawing.Printing;//调用打印命名空间 namespace 模拟文本文档Ì { public partial class Form1 : Form { string name; string dk; StringReader streamToPrint = null; Font printFont; //int FindPosition = 0; public int k = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { 撤销¨²ToolStripMenuItem.Enabled = false;//在程序运行开始时这些选择都是无效的 剪切DToolStripMenuItem.Enabled = false; 复制ToolStripMenuItem.Enabled = false; 删除yToolStripMenuItem.Enabled = false; 转到Ì?ToolStripMenuItem.Enabled = false; //状态栏ToolStripMenuItem.Enabled = false; 查找替换ToolStripMenuItem.Enabled = false; this.richTextBox1.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right | System.Windows.Forms.AnchorStyles.Top);//richTextBox1的放大与还原代码 } private void 字体¬?ToolStripMenuItem_Click(object sender, EventArgs e) { if (fontDialog1.ShowDialog() == DialogResult.OK)//获取对话框的返回值是确定 richTextBox1.SelectionFont = fontDialog1.Font;//获取系统的字体 } private void 新建ToolStripMenuItem_Click(object sender, EventArgs e) { if (richTextBox1.Modified == true) { DialogResult n = MessageBox.Show("文件" + Text + "”内容已修改\n是否要保存", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);//带有黄色感叹号的MessageBox switch (n)//使switch用语句判断 { case (DialogResult.Yes): 保存ToolStripMenuItem_Click(sender, e); break; case (DialogResult.No): richTextBox1.Text = ""; break; case (DialogResult.Cancel): richTextBox1.Modified = false; break; } } } private void 打开ToolStripMenuItem_Click_1(object sender, EventArgs e) { OpenFileDialog newdk = new OpenFileDialog();//实例化 newdk newdk.Title = "打开";//设置文件对话框的标题 string dakai = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//从电脑中检索的对应文件赋值给字符串变量dakai newdk.InitialDirectory = dakai;//将dakai赋值给newdk newdk.Filter = "纯文本(*.txt)|*.txt|c#源文件(*.cs)|*.cs|10信管一班陈勇(*.txt)|*.10信管一班陈勇";//文件名筛选器 newdk.ValidateNames = true; newdk.CheckFileExists = true; newdk.ShowHelp = true;//获取帮助按钮 newdk.Multiselect = true; newdk.FilterIndex = 2;//表示32位的有效整数不可随意赋值 if (openFileDialog1.ShowDialog() == DialogResult.OK)//在打开对话框确认的情况下 { dk = openFileDialog1.FileName;//将获取的文件名字符串赋值给dk this.richTextBox1.Text = newdk.FileName; richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); } } private void 保存ToolStripMenuItem_Click(object sender, EventArgs e) { try//使用语句处理异常情况 { StreamWriter bc = new StreamWriter(name, false, Encoding.GetEncoding("gb2312")); string baocun = richTextBox1.Text; bc.Write(baocun); bc.Close(); } catch { saveFileDialog1.Filter = "纯文本(*.txt)|*.txt|10信管一班陈勇c#源文件(*.cs)|*.cs"; saveFileDialog1.OverwritePrompt = true; if (richTextBox1.Text == "") { MessageBox.Show("请输入要保存的内容", "提示"); } else { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { StreamWriter c = new StreamWriter(saveFileDialog1.FileName, false, Encoding.GetEncoding("gb2312"));//gb2312国标,中国自己的 name = saveFileDialog1.FileName; string d = richTextBox1.Text;//将文本中的字符串赋值给局部变量 c.Write(d);//将字符串重载 c.Close(); } } } } private void 另存为aToolStripMenuItem_Click(object sender, EventArgs e)//类似保存 { if (richTextBox1.Modified == true) { DialogResult close = MessageBox.Show("是否保存已修改的内容, "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); switch (close) { case DialogResult.Yes: this.保存ToolStripMenuItem_Click(sender, e); try//使用语句处理异常情况 { StreamWriter sww = new StreamWriter(name, false, Encoding.GetEncoding("gb2312")); string data = richTextBox1.Text; sww.Write(data); sww.Close(); } catch { saveFileDialog1.Filter = "文件t|*.txt"; saveFileDialog1.OverwritePrompt = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { StreamWriter sww = new StreamWriter(saveFileDialog1.FileName, false, Encoding.GetEncoding("gb2312")); name = saveFileDialog1.FileName; string data = richTextBox1.Text; sww.Write(data); sww.Close(); } } break; case DialogResult.No: richTextBox1.Clear(); break; case DialogResult.Cancel: break; } } } private void 撤销ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.Undo();//撤销 } private void richTextBox1_TextChanged(object sender, EventArgs e) { if (richTextBox1 == null) { 剪切DToolStripMenuItem.Enabled = false; } else { 剪切DToolStripMenuItem.Enabled = true; } if (richTextBox1.Text == null) { 撤销ToolStripMenuItem.Enabled = false;//如果richTextBox1为空则无法执行 } else { 撤销ToolStripMenuItem.Enabled = true; } if (richTextBox1.Text == null)//复制 { 复制ToolStripMenuItem.Enabled = false; } else { 复制ToolStripMenuItem.Enabled = true; } if (richTextBox1.Text == null)//粘贴 { 粘贴ToolStripMenuItem.Enabled = false; } else { 粘贴ToolStripMenuItem.Enabled = true; } if (richTextBox1.Text == null) { 删除ToolStripMenuItem.Enabled = false; } else { 删除ToolStripMenuItem.Enabled = true; } if (richTextBox1.Text == null) { 查找替换ToolStripMenuItem.Enabled = false; } else { 查找替换ToolStripMenuItem.Enabled = true; } this.toolStripStatusLabel5.Text = "当前文档字数合计为" + this.richTextBox1.Text.Length; this.toolStripStatusLabel6.Text =datetime.now.Tosting(); } private void 剪?切DToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.Cut();//剪切 } private void 复制ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.Copy();//复制 } private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.Paste();//粘贴 } private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.SelectedText = "";//删除 } private void 撤销ToolStripMenuItem1_Click(object sender, EventArgs e) { richTextBox1.Undo(); } private void 全选ToolStripMenuItem1_Click(object sender, EventArgs e) { richTextBox1.SelectAll(); } private void 剪切ToolStripMenuItem1_Click(object sender, EventArgs e) { richTextBox1.Cut(); } private void 复制ToolStripMenuItem1_Click_1(object sender, EventArgs e) { richTextBox1.Copy(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { } private void saveFileDialog1_FileOk(object sender, CancelEventArgs e) { } private void 自动换行ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.WordWrap = true; } private void 打开ToolStripMenuItem_Click(object sender, EventArgs e) { this.openFileDialog1.Title = "打开"; this.openFileDialog1.Filter = "文本文件t(*.txt;*.rtf)|*.txt;*.rtf|所有文件t(*.*)|*.*"; this.openFileDialog1.FilterIndex = 1; this.openFileDialog1.InitialDirectory = "桌面"; this.openFileDialog1.ShowReadOnly = true; this.openFileDialog1.ReadOnlyChecked = false; this.openFileDialog1.FileName = ""; if (this.openFileDialog1.ShowDialog() == DialogResult.OK) { this.Text = this.openFileDialog1.FileName; StreamReader str = new StreamReader (this.openFileDialog1.FileName, Encoding.Default); this.richTextBox1.Text = str.ReadToEnd(); str.Close(); } } private void 页面属性ToolStripMenuItem_Click(object sender, EventArgs e) { printDialog1.Document = printDocument1; printDialog1.ShowDialog(); } private void 粘贴ToolStripMenuItem1_Click(object sender, EventArgs e) { richTextBox1.Paste(); } private void 复制ToolStripMenuItem1_Click(object sender, EventArgs e) { richTextBox1.Copy(); } private void 粘贴ToolStripMenuItem1_Click_1(object sender, EventArgs e) { richTextBox1.Paste(); } private void 页面属性ToolStripMenuItem_Click_1(object sender, EventArgs e) { pageSetupDialog1.Document = printDocument1; pageSetupDialog1.ShowDialog(); } private void 颜色ToolStripMenuItem_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK)//对Click事件中的颜色 richTextBox1.SelectionColor = colorDialog1.Color; } private void 颜色ToolStripMenuItem_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK)//右键功能中的颜色设置对选中的进行修改 richTextBox1.SelectionColor = colorDialog1.Color;//获取选中的文字 } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)//打印 {//用浮点类型因为可能出现小数 float linesPerPage = 0;//记录每页的最大行数 float yPosition = 0;//垂直方向的位置 int count = 0;//每页打印的行数 float leftMargin = e.MarginBounds.Left;//左边距 float topMargin = e.MarginBounds.Top;//顶边距 string line = null;//从中读取段字符串存储到line中 linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);//行数 总高度 每行高度 while (count < linesPerPage && ((line = streamToPrint.ReadLine())) != null) //如果当前打印页面行数不足页的最大行数并且读取的行数不为空那么继续打印 { yPosition = topMargin + (count * printFont.GetHeight(e.Graphics));//计算高度 e.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPosition, new StringFormat()); count++;//已打印行数再加 } if (line != null)//判断是否需要打印下一页 e.HasMorePages = true; else e.HasMorePages = false; } private void printDocument1_BeginPrint(object sender, PrintEventArgs e) { printFont = richTextBox1.Font;//打印使用的字体将richTextBox中的赋值给printFont streamToPrint = new StringReader(richTextBox1.Text);//创建读取字符串的对象 } private void printDocument1_EndPrint(object sender, PrintEventArgs e) { if (streamToPrint != null) streamToPrint.Close(); } private void 退出XToolStripMenuItem_Click(object sender, EventArgs e) { if (this.richTextBox1.Modified == true) { DialogResult tc = MessageBox.Show("文件t“¡”" + this.Text + "的内容已经修改是否要保存", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); if (tc == DialogResult.Yes) { 另存为aToolStripMenuItem_Click(sender, e); this.richTextBox1.Clear(); this.Text = ""; } if (tc == DialogResult.No) { Application.Exit(); } else { this.Close(); } } } private void toolStripMenuItem1_Click(object sender, EventArgs e)//打印预览 { printPreviewDialog1.Document = printDocument1; printPreviewDialog1.ShowDialog(); } private void 打印ToolStripMenuItem_Click_2(object sender, EventArgs e) { printDialog1.Document = printDocument1; if (printDialog1.ShowDialog(this) == DialogResult.OK) printDocument1.Print(); } private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e) { } private void 页面属性ToolStripMenuItem_Click_2(object sender, EventArgs e) { pageSetupDialog1.Document = printDocument1;//添加控件 pageSetupDialog1.ShowDialog(); } private void 颜?色ToolStripMenuItem_Click_1(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) richTextBox1.SelectionColor = colorDialog1.Color; } private void 颜色ToolStripMenuItem_Click_1(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) richTextBox1.SelectionColor = colorDialog1.Color; } private void 关于记事本ToolStripMenuItem_Click_1(object sender, EventArgs e) { formabout about = new formabout(); about.ShowDialog(); } private void 全选ToolStripMenuItem_Click_1(object sender, EventArgs e) { richTextBox1.SelectAll(); } private void 日期时间ToolStripMenuItem_Click_1(object sender, EventArgs e) { richTextBox1.Text = richTextBox1.Text + DateTime.Now.ToString(); } private void 查找ToolStripMenuItem_Click(object sender, EventArgs e)//查找 替换 { //FindPosition = 0; //formFind FindReplaceDialog = new formFind(); //FindReplaceDialog.Show(); formFind f = new formFind(); f.rtb = this.richTextBox1; //传值(从主窗口传到FindForm) f.Owner = this; //悬浮于当前窗体 f.Show(); } private void 状态栏ToolStripMenuItem_Click(object sender, EventArgs e) { if (k == -1) { statusStrip1.Show(); 状态栏ToolStripMenuItem.Checked = true; k = 0; } else { statusStrip1.Hide(); 状态栏ToolStripMenuItem.Checked = false; k = -1; } } private void toolStripStatusLabel5_Click(object sender, EventArgs e) { } private void 白色ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.BackColor = Color.White; 白色ToolStripMenuItem.Enabled = true; 灰色ToolStripMenuItem.Enabled = false; 咖啡色ToolStripMenuItem.Enabled = false; } private void 灰色ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.BackColor = Color.Gray; 白色ToolStripMenuItem.Enabled = false; 灰色ToolStripMenuItem.Enabled = true; 咖啡色ToolStripMenuItem.Enabled = false; } private void 咖啡色ToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.BackColor = Color.BurlyWood; 白色ToolStripMenuItem.Enabled = false; 灰色ToolStripMenuItem.Enabled = false; 咖啡色ToolStripMenuItem.Enabled = true; } private void 替换TToolStripMenuItem_Click(object sender, EventArgs e) { tihuan newth = new tihuan(); // newth.Show(); newth.rtb = this.richTextBox1; //传值(从主窗口传到FindForm) newth.Owner = this; //悬浮于当前窗体 newth.Show(); // tihuan newth = new tihuan(); // newth.Show(); } 3.2 formabout部分源代码(关于) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 模拟文本文档 { public partial class formabout : Form { public formabout() { InitializeComponent(); } private void formabout_Load(object sender, EventArgs e) { MaximizeBox = false;//没有最大化 MinimizeBox = false;//没有最小化 label1.Text = "Microsoft(R)文本文档版本:模拟Windows记事本,添加部分offce功能版权所有严禁盗版本产品最终解释权归冰点所有; } private void pictureBox1_Click(object sender, EventArgs e) { } private void label1_Click(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { Close(); } private void pictureBox1_Click_1(object sender, EventArgs e) { } 3.3 formFind部分源代码(查找) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 模拟文本文档 { public partial class formFind : Form { public formFind() { InitializeComponent(); } public RichTextBox rtb; int start = 0;//查找的起始位置? string nr = "";//查找的内容 RichTextBoxFinds f=0; private void button1_Click_1(object sender, EventArgs e) { this.Close(); } private void button3_Click(object sender, EventArgs e) { nr = this.textBox1.Text; //查找 start = rtb.Find(nr, start, f); if (start == -1) { MessageBox.Show("对不起查找不到与+ nr +相符的内容, (记事本)查找示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); start = 0; } else { start = start + nr.Length;//找到后从找到位置之后开始下一次 rtb.Focus(); //给予焦点 } } private void formFind_Load(object sender, EventArgs e) { } 3.4 tihuan部分源代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 模拟文本文档 { public partial class tihuan : Form { public tihuan() { InitializeComponent(); } public RichTextBox rtb; int start = 0;//开始位置 string nr = "";//定义内容字符串 string th = "";//定义转换字符串 RichTextBoxFinds f=0;// int i = 0; private void tihuan_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e)//查找 { nr = this.textBox1.Text;//将textBox1中的内容赋值给 start = rtb.Find(nr, start, f);//开始的位置是找到的内容 if (start == -1)//找不到啊 { MessageBox.Show("对不起查找不到与+ nr +内容相匹配的信息, 记事本查找提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); start = 0;//返回开始位置 } else { start = start + nr.Length;//找到后从找到位置之后开始下一次 rtb.Focus(); //给予焦点,此处不解 } } private void button2_Click(object sender, EventArgs e) { nr = this.textBox1.Text;//找的内容 th = this.textBox2.Text;//替换的内容 // rtb.SelectedText = th; //start = rtb.Find(nr, start, f); if (start == -1) { MessageBox.Show("对不起查找不到与+ nr + 内容相匹配的信息, 记事本查找提示信息", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else { rtb.SelectedText =th; // start = start + th.Length;//找到后从找到位置之后开始下一次 // rtb.Focus(); //给予焦点 } } private void button3_Click(object sender, EventArgs e) { nr = this.textBox1.Text;//找的内容 th = this.textBox2.Text; start = rtb.Find(nr, start, f); while (start != -1) { rtb.SelectedText = th; start = start + nr.Length; start = rtb.Find(nr, start, f); i++; } MessageBox.Show("全部替换完毕,全部一共替换了 + i.ToString() + "次, "记事本替换完毕信息); start = 0; } private void button4_Click(object sender, EventArgs e) { this.Close(); } } } 4. 调试结果 4.1在实现查找功能时无法在文本文档中找到相应的内容 一个警告,原因是我在别人的电脑上调试,出现这种情况解决方案 4.2 解决方案是在主窗体中将定义的初始位置注释掉,结果发现还不行,于是从新分析查找过程,根据过程再修改代码,调试成功。 4.3在实现鼠标右键过程中,我们采用代码来实现,结果发现无从下手。 解决方案是询问计科班同学,发现ShortCutKry是用来设置快捷键的 4.4在运行过程中,会随机的出现未处理的类型的“Sydtem.NullReferenceException”异常出现在未知模板中及信息,未将对象引用到对象实例化。 5. 设计总结及心得体会 设计总结: 我们就是模仿一个文本文档,在此基础上实现打印与打印预览功能。总共涉及文件、编辑、格式、查看、帮助五大类,二十六项功能和鼠标右键快捷键设置。除转到没实现外,其余均实现了,还有就是我们对文本窗体的外观进行修改。 心得体会: (1) 首先是觉得团队合作的速度之快,我们一起设计好主窗体之后,两个男生负责文件、编辑这部分,女生负责格式、查看、帮助这部分。 (2) 还有在我们解决问题后的那种快感 (3) 对自己的思维能力也是一种锻炼。比如在实现打印预览时就要考虑要打印的内容是否足一页,那么怎样知道是否足一页呢?我们就拿纸比划,结果采用一种方法,就是(正文的高度/每行字的高度)/(一页纸的高度-页眉-页脚)的值a,大于零,还是小于零,如果大于零就说明超过一页,在执行打印一份后再执行打印几份,如果小于零就执行打印几份。 (4) 还有就是我们对窗体外观的“美容”,不仅好看而且在下方还能实现输入了多少字和年月日。 (5) 最后就是有些小遗憾,还有一个功能没实现。 姓名 分工 时间 课程设计进展 完成情况 陈勇 文件 外观设置 5.29 设计文本编辑器的外观和整体框架 全部完成 5.30 退出 新建 新建未完形成 6.3 新建 打开 全部完成 6.4 打印 打印预览 页面属性 全部完成 6.5 保存 另存为 未完成 6.6 保存 另存为 全部完成 尹海彬 编辑 5.29 撤销 剪切 复制 粘贴 删除 全选 时间/日期 全部完成 6.1 查找 替换 均未完成 6.4-6.5 查找 替换 全部完成 刘玉洁 自动换行 6.1 自动换行 字体 全部完成 6.2 颜色 背景颜色 全部完成 沈婷婷 查看 鼠标右键功能 6.1 状态栏 未完成 6.3 状态栏 全部完成 6.6 鼠标右键快捷键设置 全部完成 李亚威 帮助 打包 6.1 关于记事本 全部完成 6.2 客户反馈 帮助主题 完成部分 6.3-6.4 帮助主题 全部完成 6.7 打包 全部完成