好一段时间了,今天写了个简单的记事本,记录一下我的成长,是不是长的太慢了呢?!
目前这个记事本可以实现一些比较常用的功能,比如复制,粘贴,保存,切换字体之类的工作都能干了。后面再继续强大。。。
记事本是由一个菜单栏和文本框组成的,简单实用。其实做这些界面都还好,只要熟悉了窗体以及各种控件的基本属性就差不多了。
下面是一个简单的记事本窗体:
在这里面我们为上下文菜单中的菜单项设置功能。
这里面我犯了一个错误。
问题:
在写复制粘贴功能的时候想的过于复杂。我以为复制需要将所选定内容通过读取流(StreamReader)先读到流里面,然后再在粘贴的时候再次通过写入流(StreamWriter)将之前读到的内容再写如指定的位置。但是WinForm已经给我们预先准备好了Copy方法和Paste方法,我们可以直接通过文本框调用方法就可以了。
思考:
在接触新知识的时候我们除了用学过的知识来解决它,更应该做的是寻找新的方法。如果单凭老师将的,而不去自己摸索,那收获远远下减少了。猜猜蒙蒙碰碰,更能为我们带来意想不到的收获。
看看代码:
//复制 private void mnuCopy_Click(object sender, EventArgs e) { this.txtContent.Copy(); } //粘贴 private void mnuPast_Click(object sender, EventArgs e) { this.txtContent.Paste(); } //剪贴 private void mnuCut_Click(object sender, EventArgs e) { this.txtContent.Cut(); } //全选 private void mnuSelectAll_Click(object sender, EventArgs e) { this.txtContent.SelectAll(); } //新建 private void NewToolStripMenuItem_Click(object sender, EventArgs e) { this.txtContent.Text = "";//新建其实就是将文本框清空 } //打开一个新的文件 private void OpenToolStripMenuItem_Click(object sender, EventArgs e) { //提示用户打开文件 OpenFileDialog ofd = new OpenFileDialog(); DialogResult dr = ofd.ShowDialog(); if (dr==DialogResult.Cancel) { return; } string path = ofd.FileName; StreamReader sr = new StreamReader(path,Encoding.GetEncoding("GB2312")); string s=sr.ReadToEnd(); this.txtContent.Text = s; sr.Close(); } private void SaveToolStripMenuItem_Click(object sender, EventArgs e) { //判断当前有没有存储路径 if (savePath == null) { //如果没有,就意味着着一定是第一次保存。就打开对话框提示用户选择路径 SaveFileDialog sfd = new SaveFileDialog(); DialogResult dr = sfd.ShowDialog(); //判断用户的选择以确定是否要继续 if (dr == DialogResult.Cancel) { return; } //选择要保存的路径 string path = sfd.FileName; savePath = path; }//创建一个流(一根管道),用来存储写入的文件 StreamWriter sw = new StreamWriter(savePath, false, Encoding.GetEncoding("GB2312")); //将文本中的内容写入流 sw.Write(this.txtContent.Text); sw.Flush(); sw.Close(); } //另存为 string savePath = null; private void OtherSaveToolStripMenuItem_Click(object sender, EventArgs e) { //另存为按钮每次被按下都应该弹出一个路径选择对话框 //提示用户选择保存路径 SaveFileDialog sfd = new SaveFileDialog(); DialogResult dr = sfd.ShowDialog(); if (dr == DialogResult.Cancel) { return; } //选择要保存的路径 string path = sfd.FileName; savePath = path; //将流中的内容写进选择好的路径 StreamWriter sw = new StreamWriter(savePath, false, Encoding.GetEncoding("GB2312")); //将文本中的内容写入流 sw.Write(this.txtContent.Text); sw.Flush(); sw.Close(); } //退出 private void exitToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } //删除 private void deleteToolStripMenuItem_Click(object sender, EventArgs e) { this.txtContent.Cut();//将选定内容移动到剪贴板 Clipboard.Clear();//从剪贴板中移除所有数据 } //撤销 private void toolStripMenuItem5_Click(object sender, EventArgs e) { this.txtContent.Undo();//撤销文本框的上一个编辑操作 } //设置字体 private void fontToolStripMenuItem_Click(object sender, EventArgs e) { //提示用户选择一种字体 FontDialog fd = new FontDialog(); //将当前字体传进选择框,这样即使用户没有选择也不会改变原来的字体样式 fd.Font = this.txtContent.Font; DialogResult dr = fd.ShowDialog(); //判断用户的选择 if (dr==DialogResult.Cancel) { return; } //将用户选择字体用于当前文档 this.txtContent.Font = fd.Font; } //自动换行 private void autoWorlWrapToolStripMenuItem_Click(object sender, EventArgs e) { //设置自动换行工具菜单项的checked属性的值与当前相反 this.autoWorlWrapToolStripMenuItem.Checked = !this.autoWorlWrapToolStripMenuItem.Checked; //将设置好的值应用到当前文档 this.txtContent.WordWrap = this.autoWorlWrapToolStripMenuItem.Checked; } //获取当前日期 private void 时间日期ToolStripMenuItem_Click(object sender, EventArgs e) { this.txtContent.Text+= DateTime.Now.ToString();//在文档最后加入当前日期 } }