用C#实现记事本功能
目录
一、程序设计案例
使用Visual C# 2019设计一个Windows应用程序——记事本,实现Windows自带的记事本的部分功能:具有文件的新建、打开、保存功能;文字的复制、粘贴、删除功能;字体类型、格式的设置功能;查看日期时间等功能,并且用户可以根据需要显示或者隐藏工具栏和状态栏,还可以任意更改字体的字体类型、大小和颜色,并在状态栏中显示时间。为了方便用户的操作,还在程序的窗体上放置了一个工具栏。
二、记事本界面设计
1.建立基本控件
建立窗体
新建一个windows窗体应用程序,并命名为"Notepad"
窗体属性
MenuStrip(菜单控件)
ToolStrip(工具栏控件)
1.单击窗体左边会出现工具箱→ 找到“ToolStrip” →拖动到窗体中→单击工具栏→右下角属性→修改Name属性为“tlsNotepad”
2.右击工具栏→ 插入标准项
3.右击工具栏→ 编辑项 可以看到我们的按钮成员,在这里我们可以删除或者增加
RichTextBox(多格式文本框控件)
单击窗体左边会出现工具箱→ 找到“RichTextBox” →拖动到窗体中→单击工具栏→右下角属性→修改Name属性为“rtxtNotepad”
Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变
StatusStrip(状态栏控件)
添加StatusStrip控件,将其Name属性设为“stsNotepad”,将Dock属性设为“Bottom”再将Anchor属性设为“Bottom,Left,Right”。然后单击右边的按钮,打开【项集合编辑器】对话框
下拉列表中保留默认的选择“StatusLabel”,然后单击【添加】按钮,依次添加2个StatusLabel,并分别命名为“tssLbl1”和“tssLbl2”,再将tssLbl1的Text属性设为“就绪”, tssLbl2的Text属性设为“显示日期、时间”。
OpenFileDialog(打开对话框)
OpenFileDialog控件的Name属性为“odlgNotepad”,Filter属性设为“RTF文件|.rtf|所有文件|.*”。
SaveFileDialog(保存对话框)
SaveFileDialog控件的Name属性为“sdlgNotepad”,FileName属性改为“无标题”,Filter属性设为“RTF文件|*.rtf”。
FontDialog(字体对话框)
FontDialog控件的Name属性为“fdlgNotepad”
Timer(计时器控件)
Timer控件的Name属性设为“tmrNotepad”,Enabled(激活的可行的)属性设为“True”,Interval(间隔,间距,幕间时间)属性设为“1000”,表示1秒种触发一次Tick事件,即1秒钟改变一次时钟
记事本界面
2.读入数据
代码如下:
public partial class frmNotepad : Form { //************************************************************************* /* 布尔变量b用于判断文件是新建的还是从磁盘打开的, true表示文件是从磁盘打开的,false表示文件是新建的,默认值为false*/ bool b = false; /* 布尔变量s用于判断文件件是否被保存, true表示文件是已经被保存了,false表示文件未被保存,默认值为true*/ bool s = true; //************************************************************************* public frmNotepad() { InitializeComponent(); } private void frmNotepad_Load(object sender, EventArgs e) { } private void rtxtNotepad_TextChanged(object sender, EventArgs e) { // 文本被修改后,设置s为false,表示文件未保存 s = false; } private void tsmiFile_Click(object sender, EventArgs e) { } private void tsmiNew_Click(object sender, EventArgs e) { // 判断当前文件是否从磁盘打开,或者新建时文档不为空,并且文件未被保存 if (b == true || rtxtNotepad.Text.Trim() != "") { // 若文件未保存 if (s == false) { string result; result = MessageBox.Show("文件尚未保存,是否保存?", "保存文件", MessageBoxButtons.YesNoCancel).ToString(); switch (result) { case "Yes": // 若文件是从磁盘打开的 if (b == true) { // 按文件打开的路径保存文件 rtxtNotepad.SaveFile(odlgNotepad.FileName); } // 若文件不是从磁盘打开的 else if (sdlgNotepad.ShowDialog() == DialogResult.OK) { rtxtNotepad.SaveFile(sdlgNotepad.FileName); } s = true; rtxtNotepad.Text = ""; break; case "No": b = false; rtxtNotepad.Text = ""; break; } } } } private void tsmiOpen_Click(object sender, EventArgs e) { if (b == true || rtxtNotepad.Text.Trim() != "") { if (s == false) { string result; result = MessageBox.Show("文件尚未保存,是否保存?", "保存文件", MessageBoxButtons.YesNoCancel).ToString(); switch (result) { case "Yes": if (b == true) { rtxtNotepad.SaveFile(odlgNotepad.FileName); } else if (sdlgNotepad.ShowDialog() == DialogResult.OK) { rtxtNotepad.SaveFile(sdlgNotepad.FileName); } s = true; break; case "No": b = false; rtxtNotepad.Text = ""; break; } } } odlgNotepad.RestoreDirectory = true; if ((odlgNotepad.ShowDialog() == DialogResult.OK) && odlgNotepad.FileName != "") { rtxtNotepad.LoadFile(odlgNotepad.FileName);//打开代码语句 b = true; } s = true; } private void tsmiSave_Click(object sender, EventArgs e) { // 若文件从磁盘打开并且修改了其内容 if (b == true && rtxtNotepad.Modified == true) { rtxtNotepad.SaveFile(odlgNotepad.FileName); s = true; } else if (b == false && rtxtNotepad.Text.Trim() != "" && sdlgNotepad.ShowDialog() == DialogResult.OK) { rtxtNotepad.SaveFile(sdlgNotepad.FileName);//保存语句 s = true; b = true; odlgNotepad.FileName = sdlgNotepad.FileName; } } private void tsmiSaveAs_Click(object sender, EventArgs e) { if (sdlgNotepad.ShowDialog() == DialogResult.OK) { rtxtNotepad.SaveFile(sdlgNotepad.FileName); s = true; } } private void tsmiClose_Click(object sender, EventArgs e) { Application.Exit();//程序结束 } private void tsmiUndo_Click(object sender, EventArgs e) { rtxtNotepad.Undo();//撤销 } private void tsmiCopy_Click(object sender, EventArgs e) { rtxtNotepad.Copy();//复制 } private void tsmiCut_Click(object sender, EventArgs e) { rtxtNotepad.Cut();//剪切 } private void tsmiPaste_Click(object sender, EventArgs e) { rtxtNotepad.Paste();//粘贴 } private void tsmiSelectAll_Click(object sender, EventArgs e) { rtxtNotepad.SelectAll();//全选 } private void tsmiDate_Click(object sender, EventArgs e) { rtxtNotepad.AppendText(System.DateTime.Now.ToString());//显示当前日期 } private void tsmiAuto_Click(object sender, EventArgs e) { if (tsmiAuto.Checked == false) { tsmiAuto.Checked = true; // 选中该菜单项 rtxtNotepad.WordWrap = true; // 设置为自动换行 } else { tsmiAuto.Checked = false; rtxtNotepad.WordWrap = false; } } private void tsmiFont_Click(object sender, EventArgs e) { fdlgNotepad.ShowColor = true; if (fdlgNotepad.ShowDialog() == DialogResult.OK) { rtxtNotepad.SelectionColor = fdlgNotepad.Color; rtxtNotepad.SelectionFont = fdlgNotepad.Font; } } private void tsmiToolStrip_Click(object sender, EventArgs e) { Point point; if (tsmiToolStrip.Checked == true) { // 隐藏工具栏时,把坐标设为(0,24),因为菜单的高度为24 point = new Point(0, 24); tsmiToolStrip.Checked = false; tlsNotepad.Visible = false; // 设置多格式文本框左上角位置 rtxtNotepad.Location = point; // 隐藏工具栏后,增加文本框高度 rtxtNotepad.Height += tlsNotepad.Height; } else { /* 显示工具栏时,多格式文本框左上角位置的位置为(0,49), 因为工具栏的高度为25,加上菜单的高度24后为49 */ point = new Point(0, 49); tsmiToolStrip.Checked = true; tlsNotepad.Visible = true; rtxtNotepad.Location = point; rtxtNotepad.Height -= tlsNotepad.Height; } } private void tsmiStatusStrip_Click(object sender, EventArgs e) { if (tsmiStatusStrip.Checked == true) { tsmiStatusStrip.Checked = false; stsNotepad.Visible = false; rtxtNotepad.Height += stsNotepad.Height; } else { tsmiStatusStrip.Checked = true; stsNotepad.Visible = true; rtxtNotepad.Height -= stsNotepad.Height; } } private void tsmiAbout_Click(object sender, EventArgs e) { frmAbout ob_FrmAbout = new frmAbout(); ob_FrmAbout.Show(); } }
3.工具栏代码
代码如下:
private void tlsNotepad_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
int n;
// 变量n用来接收按下按钮的索引号从0开始
n = tlsNotepad.Items.IndexOf(e.ClickedItem);
switch (n)
{
case 0:
tsmiNew_Click(sender, e);
break;
case 1:
tsmiOpen_Click(sender, e);
break;
case 2:
tsmiSave_Click(sender, e);
break;
/*case 3:
tsmiCopy_Click(sender, e);
break;*/ // 我们不用case3
case 4:
tsmiCut_Click(sender, e);
break;
case 5:
tsmiPaste_Click(sender, e);
break;
/*case 6:
tsmiPaste_Click(sender, e);
break; */ // 我们不用case6
case 7:
tsmiAbout_Click(sender, e);
break;
}
}
4.计时器代码
private void tmrNotepad_Tick(object sender, EventArgs e) { tssLbl2.Text = System.DateTime.Now.ToString(); }
三。关于记事本
1.界面设计
2.核心代码
private void btnOk_Click(object sender, EventArgs e)
{
this.Close();
}
private void LinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("http://www.baidu.com");
}
四。结果截图
五。仓库链接地址
源代码:
实现记事本功能: 使用C#语言实现记事本功能 (gitee.com)
六。实验心得
本实验设计了一个windows应用程序——记事本,进一步掌握MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等空间的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取,格式设置等操作。在实验过程中,体会到了用c#语言可以做一些页面设计,不用html,css,js等前端技术就可以轻松完成,十分有意思,需要更深入了解和学习一些控件的使用。