好一段时间了,今天写了个简单的记事本,记录一下我的成长,是不是长的太慢了呢?!
目前这个记事本可以实现一些比较常用的功能,比如复制,粘贴,保存,切换字体之类的工作都能干了。后面再继续强大。。。
记事本是由一个菜单栏和文本框组成的,简单实用。其实做这些界面都还好,只要熟悉了窗体以及各种控件的基本属性就差不多了。
下面是一个简单的记事本窗体:
在这里面我们为上下文菜单中的菜单项设置功能。
这里面我犯了一个错误。
问题:
在写复制粘贴功能的时候想的过于复杂。我以为复制需要将所选定内容通过读取流(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();//在文档最后加入当前日期
}
}
转载于:https://blog.51cto.com/broncho/1305547