C#实现多功能记事本
一、实验目的
使用Visual C# 2022设计一个Windows应用程序——记事本,进一步掌握MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取、格式设置等操作,参考电脑中的记事本,完成关于新建,保存,粘贴,复制的基本功能,合理的运用C#中的相关控件。
二、实验过程
1.1 记事本简介
记事本是一种常用的软件,图1Windows自带的记事本软件
图1 Windows自带的记事本
本次实验实现的记事本,除了具有Windows自带的记事本功能外(文件的新建、打开、保存功能),还可以任意更改字体的字体类型、大小和颜色,并在状态栏中显示日期时间。为了方便操作,还在程序的窗体上放置了一个工具栏,并且用户可以根据需要显示或者隐藏工具栏和状态栏。
1.2 记事本界面设计
新建一个Windows窗体应用程序,并命名为“Notepad”。本节介绍记事本程序的界面设计以及界面上各控件的属性设置。
1.打开VS2013 单击 文件→新建→项目
2.选择 模版 → Visual C# → windows→ windows窗体应用程序 在下面的名称写Notepad 出现界面如图所示
3.更改窗体名称 单击窗体, →右下角属性→text 修改为“记事本”如图所示
按照3设置剩下的窗体属性
控件类型 |
控件名称 |
属性 |
设置结果 |
Form |
Form1 |
Name |
frmNotepad |
Text |
记事本 |
||
StartPosition(起始位置) |
CenterScreen(中央屏幕) |
||
Size |
600, 450 |
4.界面设计
新建好“Notepad”项目后,定位到记事本程序的窗体设计器窗口,然后依次在窗体上放置以下控件(各1个):
(1)MenuStrip(菜单控件)
单击窗体左边会出现工具箱→ 找到menustrip →拖动到窗体中
单击菜单栏→右下角属性→修改Name属性为“mnusNotepad”
单击 输入【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】
设置【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】的属性→单击【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】找到对应的属性窗口,按照以下表格进行设置
Text属性 |
Name属性 |
ShortcutKeys属性 (快捷键) |
ShowShortcutKeys属性 |
文件(&F) |
tsmiFile |
None |
- |
新建(&N) |
tsmiNew |
Ctrl+N |
True |
打开(&O) |
tsmiOpen |
Ctrl+O |
True |
保存(&S) |
tsmiSave |
Ctrl+S |
True |
另存为(&A) |
tsmiSaveAs |
None |
- |
分隔符(用“-”来分隔) |
|||
退出(&X) |
tsmiClose |
None |
- |
Text属性 |
Name属性 |
ShortcutKeys属性 |
ShowShortcutKeys属性 |
|||||
编辑(&E) |
tsmiEdit |
None |
- |
|||||
撤销(&U) |
tsmiUndo |
Ctrl+Z |
True |
|||||
分隔符 |
||||||||
复制(&C) |
tsmiCopy |
Ctrl+C |
True |
|||||
剪切(&T) |
tsmiCut |
Ctrl+X |
True |
|||||
粘贴(&P) |
tsmiPaste |
Ctrl+V |
True |
|||||
分隔符 |
||||||||
全选(&A) |
tsmiSelectAll |
Ctrl+A |
True |
|||||
日期(&D) |
tsmiDate |
F5 |
True |
|||||
Text属性 |
Name属性 |
Check属性 |
||||||
格式(&O) |
tsmiFormat |
False |
||||||
自动换行(&W) |
tsmiAuto |
True |
||||||
字体(&F) |
tsmiFont |
False |
||||||
Text属性 |
Name属性 |
Checked属性 |
||||||
查看(&V) |
tsmiView |
False |
||||||
工具栏(&T) |
tsmiToolStrip |
True |
||||||
状态栏(&S) |
tsmiStatusStrip |
True |
||||||
Text属性 |
Name属性 |
|||||||
帮助(&H) |
tsmiHelp |
|||||||
关于记事本(&A) |
tsmiAbout |
到此 菜单栏框架设置完成!
(2)ToolStrip(工具栏控件)
单击窗体左边会出现工具箱→ 找到“ToolStrip” →拖动到窗体中
单击工具栏→右下角属性→修改Name属性为“tlsNotepad”
右击工具栏→ 插入标准项 出现
右击工具栏→ 编辑项 可以看到我们的按钮成员,设置几个简单的功能(新建,打开,保存,剪切,粘贴,复制)。
(3)RichTextBox(多格式文本框控件)
单击窗体左边会出现工具箱→ 找到“RichTextBox” →拖动到窗体中
单击工具栏→右下角属性→修改Name属性为“rtxtNotepad”
Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变
(4)StatusStrip(状态栏控件)
添加StatusStrip控件,将其Name属性设为“stsNotepad”,将Dock属性设为“Bottom”再将Anchor属性设为“Bottom,Left,Right”。然后单击右边的按钮,打开【项集合编辑器】对话框
下拉列表中保留默认的选择“StatusLabel”,然后单击【添加】按钮,依次添加2个StatusLabel,并分别命名为“tssLbl1”和“tssLbl2”,再将tssLbl1的Text属性设为“就绪”, tssLbl2的Text属性设为“显示日期、时间”。
(5)OpenFileDialog(打开对话框)
从工具箱中找到OpenFileDialog直接拖入窗体中 单击属性
当用户单击记事本的【文件】→【打开】菜单项时,使用打开对话框OpenFileDialog打开文件。OpenFileDialog控件的Name属性为“odlgNotepad”,Filter属性设为“RTF文件|*.rtf|所有文件|*.*”。
(6)SaveFileDialog(保存对话框)
从工具箱中找到SaveFileDialog直接拖入窗体中 单击属性
当用户单击记事本的【文件】→【保存】(或【另存为】)菜单项时,使用保存对话框SaveFileDialog保存文件。SaveFileDialog控件的Name属性为“sdlgNotepad”,FileName属性改为“无标题”,Filter属性设为“RTF文件|*.rtf”。
(7)FontDialog(字体对话框)
从工具箱中找到FontDialog直接拖入窗体中 单击属性
当用户单击记事本的【格式】→【字体】菜单项时,使用字体对话框FontDialog设置文本字体。FontDialog控件的Name属性为“fdlgNotepad”。
(8)Timer(计时器控件)
从工具箱中找到Timer直接拖入窗体中 单击属性
本章介绍的记事本在状态栏中显示了时钟,这就需要使用一个Timer控件来实现。Timer控件的Name属性设为“tmrNotepad”,Enabled(激活的可行的)属性设为“True”,Interval(间隔,间距,幕间时间)属性设为“1000”,表示1秒种触发一次Tick事件,即1秒钟改变一次时钟。
最终设置界面如下图所示
(9)关于记事本
单击Visual C# 2013的【项目】→【添加Windows窗体】菜单项,添加一个名为“frmAbout”的窗体
1. 界面设计
然后给窗体“frmAbout”添加几个Label、Button、LinkLabel和PictrueBox控件,按照信息设置好属性后的程序界面如图所示。
【关于记事本】窗体和窗体上各控件的属性设置如表所示。
窗体和各控件的属性
控件类型 |
控件名称 |
属性 |
设置结果 |
Form |
Form2 |
Name |
frmAbout |
Text |
关于记事本 |
||
StartPosition |
CenterScreen |
||
MaximizeBox |
False |
||
AutoSizeMode |
GrowAndShrink |
||
Button |
Button1 |
Name |
btnOk |
Text |
确定 |
||
Label |
Label1 |
Text |
多功能记事本 |
LinkLabe |
LinkLabel |
Text |
如有问题,点击这里 |
1.3 编写程序代码
(1)多格式文本框代码
//*************************************************************************
// 多格式文本框的TextChanged事件代码
//*************************************************************************
private void rtxtNotepad_TextChanged(object sender, EventArgs e)
{// 文本被修改后,设置s为false,表示文件未保存s = false;
}
(2)【文件(F)】菜单代码
1.新建菜单代码
//*************************************************************************
// 【新建】菜单代码
//*************************************************************************
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;}}}
}
2.打开菜单代码
//*************************************************************************
// 【打开】菜单代码
//*************************************************************************
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;
}
3.保存菜单代码
//*************************************************************************
// 【保存】菜单代码
//*************************************************************************
private void tsmiSave_Click(object sender, EventArgs e)
{//由于这个没有改Name属性,所以和图片不太一样,对照就行// 若文件从磁盘打开并且修改了其内容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;}
}
4.另存为菜单代码
//*************************************************************************
// 【另存为】菜单代码
//*************************************************************************
private void tsmiSaveAs_Click(object sender, EventArgs e)
{if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);s = true;}
}
5.退出菜单代码
//*************************************************************************
// 【退出】菜单代码
//*************************************************************************
private void tsmiClose_Click(object sender, EventArgs e)
{Application.Exit();//程序结束
}
(3)【编辑(E)】菜单代码
//*************************************************************************
// 【编辑】菜单各菜单项的单击代码
//*************************************************************************// 【撤销】菜单代码
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());//显示当前日期
}
(4)【格式(O)】菜单代码
1.【自动换行(W)】菜单项
//*************************************************************************
// 【自动换行】菜单代码
//*************************************************************************
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;}
}
2.【字体(F)】菜单项
//*************************************************************************
// 【字体】菜单代码
//*************************************************************************
private void tsmiFont_Click(object sender, EventArgs e)
{fdlgNotepad.ShowColor = true;if (fdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SelectionColor = fdlgNotepad.Color;rtxtNotepad.SelectionFont = fdlgNotepad.Font;}
}
(5)【查看(V)】菜单代码
(1) 【工具栏(T)】菜单项
//*************************************************************************
// 【工具栏】菜单代码(不是必须的)
//*************************************************************************
private void tsmiToolStrip_Click(object sender, EventArgs e)
{Point point;if (tsmiToolStrip.Checked == true){// 隐藏工具栏时,把坐标设为(0,24),因为菜单的高度为24point = 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;}
}
(2) 【状态栏(S)】菜单项
//*************************************************************************
// 【状态栏】菜单代码
//*************************************************************************
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;}
}
(6)【帮助(H)】菜单代码
//*************************************************************************
// 【关于记事本】菜单代码
//*************************************************************************
private void tsmiAbout_Click(object sender, EventArgs e)
{frmAbout ob_FrmAbout = new frmAbout();ob_FrmAbout.Show();
}
(7)工具栏代码
//*************************************************************************
// 工具栏的ItemClicked事件代码
//*************************************************************************
private void tlsNotepad_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{int n;// 变量n用来接收按下按钮的索引号从0开始n = tlsNotepad.Items.IndexOf(e.ClickedItem);switch (n){ case 0:新建NToolStripButton_Click (sender, e);break;case 1:打开OToolStripButton_Click (sender, e);break;case 2:保存SToolStripButton_Click (sender, e);break;/*case 3:tsmiCopy_Click(sender, e);break;*/ // 我们不用case3case 4:剪切UToolStripButton_Click (sender, e);break;case 5:粘贴PToolStripButton_Click (sender, e);break;/*case 6:tsmiPaste_Click(sender, e);break; */ // 我们不用case6case 7:tsmiAbout_Click (sender, e);break;}
}
(8)【关于记事本】代码
//*************************************************************************
// 【关于记事本】代码
//*************************************************************************// 【确定】按钮
private void btnOk_Click(object sender, EventArgs e)
{this.Close();
}// 使用LinkLabel打开邮件或者网页
private void llblEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{System.Diagnostics.Process.Start(“http://www.baidu.com”);
}
(9)计时器代码
//*************************************************************************
// 计时器控件的Tick事件代码
//*************************************************************************
private void tmrNotepad_Tick(object sender, EventArgs e)
{tssLbl2.Text = System.DateTime.Now.ToString();
}
(10)窗体代码
//*************************************************************************
// 窗体的的SizeChanged事件代码
//*************************************************************************
private void frmNotepad_SizeChanged(object sender, EventArgs e)
{frmNotepad ob_frmNotepad = new frmNotepad();tssLbl1.Width = this.Width / 2 - 12;tssLbl2.Width = tssLbl1.Width;
}
三、实验结果
四、实验小结
做出了记事本虽然功能简单,但其中包含了Windows窗体应用程序不同组件的应用,最终成功实现记事本功能还是一件小有成就的事,也对我学习有很大帮助。
五、代码仓库
Notepad · HAX666/记事本 - Gitee.com
C#实现多功能记事本相关推荐
- 基于微信小程序的多功能记事本软件开发 报告+前后台(java)项目源码+数据库
摘 要 随着人们生活越来越被科技方便化,人们已经不能接受自己做笔记或者记录生活变得慢速或者繁琐,手机市场的发展让人们越来越习惯用手机来办公或者娱乐,人们的生活和手机的关系越来越紧密,对手机的需求迅速增 ...
- Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理
Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理 实验内容和环境:(包括软件平台和硬件平台) QT5.14.1 Ubuntu操作系统 实验内容及步骤 (含源程序): 用QT ...
- 计算机的记事本和写字板的功能,记事本和写字板有什么不同?功能上
事本是txt格式,写字板是rtf格式. "写字板"是一个使用简单,但却功能强大的文字处理程序,用户可以利用它进行日常工作中文件的编辑.它不仅可以进行中英文文档的编辑,而且还可以图文 ...
- Java程序设计基础——期末综合程序多功能记事本
记事本 自学 记事本 1.界面设计: (1)菜单区: (2)文本区: 2.事件设计:(这里给出对每个功能不完整的操作代码) (1)新建: (2)打开: (3)保存: (4)另存为: (5)退出: (6 ...
- java实现多功能记事本
展示 功能 代码 package demo; import java.util.Date; import java.text.SimpleDateFormat; import java.awt.Bor ...
- Android记事本NotePad应用功能拓展
Android记事本NotePad应用功能拓展 一.实现功能 1.NoteList中显示条目增加时间戳显示 添加时间戳 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y ...
- vue之实现记事本功能
文章目录 记事本功能 1. 新增 2. 删除 3. 统计 4. 清空 5. 隐藏 记事本功能 记事本有基本的增删改查等操作功能,输入框输入内容回车添加,每添加一条内容左下角就会增加一条记录 当想要删除 ...
- HOOK大法实现不修改程序代码给程序添加功能
[文章标题]: HOOK大法实现不修改程序代码给程序添加功能 [文章作者]: 0x18c0 [软件名称]: Scylla [使用工具]: OD.Stub_PE.ResHacker [版权声明]: 本文 ...
- 使用C#设计一个Windows应用程序——记事本
文章主要内容:通过本文介绍学习,可以进一步掌握MenuStrip(菜单).ToolStrip(工具栏).RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何 ...
- p系统ndows10的功能更新1903,Win10 1903到底有什么不同?Win10 1903更新内容汇总
在2019年的四月,微软为Win10系统推送了19H1版本更新,也就是Win10 1903.作为一年两次的大版本更新,win10 1903有不少用户在关注,那么它有什么不同之处呢?到底更新了什么功能? ...
最新文章
- Swift类与OC类方法相互调用的
- 产品设计体会(6014)商业智能的尝试
- [转载]VS2005中ifstream不能读中文路径文件的bug
- 基于 Spring Boot 的车牌识别系统(附项目地址)
- [BZOJ2095]Bridges
- Flutter入门:Offstage和Visibility
- 数据的插入、更新、删除
- 60K!刚面完Python!这个被Oracle裁掉的程序员求职刷爆全网!
- 安装ugjava安装在哪里_南开区业销售避雷墩/哪里有安装的
- 【CS学习笔记】26、杀毒软件
- Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例
- layout_gravity和gravity的区分和应用
- 如何修改Kestrel上传文件的大小
- 用git来管理单机游戏存档
- python词云图库一般装多久_Python数据可视化:词云库的讲解和如何制作词云
- 服务和控制器应用CPU占用过高 根源问题彻底解决
- 下载pyboard的flash中的驱动程序_打印机驱动程序被标记为恶意软件 戴尔已紧急撤下链接...
- 数模混合仿真实例(数字verilog作为顶层)VCS+XA
- linux查看oracle线程,【实验】【PsList】使用PsList查看Windows上Oracle的线程等信息
- 2021年3季度手机银行活跃用户突破6.2亿,中小上市银行增长突出