一、实验目的

使用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#实现多功能记事本相关推荐

  1. 基于微信小程序的多功能记事本软件开发 报告+前后台(java)项目源码+数据库

    摘 要 随着人们生活越来越被科技方便化,人们已经不能接受自己做笔记或者记录生活变得慢速或者繁琐,手机市场的发展让人们越来越习惯用手机来办公或者娱乐,人们的生活和手机的关系越来越紧密,对手机的需求迅速增 ...

  2. Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理

    Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理 实验内容和环境:(包括软件平台和硬件平台) QT5.14.1 Ubuntu操作系统 实验内容及步骤 (含源程序): 用QT ...

  3. 计算机的记事本和写字板的功能,记事本和写字板有什么不同?功能上

    事本是txt格式,写字板是rtf格式. "写字板"是一个使用简单,但却功能强大的文字处理程序,用户可以利用它进行日常工作中文件的编辑.它不仅可以进行中英文文档的编辑,而且还可以图文 ...

  4. Java程序设计基础——期末综合程序多功能记事本

    记事本 自学 记事本 1.界面设计: (1)菜单区: (2)文本区: 2.事件设计:(这里给出对每个功能不完整的操作代码) (1)新建: (2)打开: (3)保存: (4)另存为: (5)退出: (6 ...

  5. java实现多功能记事本

    展示 功能 代码 package demo; import java.util.Date; import java.text.SimpleDateFormat; import java.awt.Bor ...

  6. Android记事本NotePad应用功能拓展

    Android记事本NotePad应用功能拓展 一.实现功能 1.NoteList中显示条目增加时间戳显示 添加时间戳 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y ...

  7. vue之实现记事本功能

    文章目录 记事本功能 1. 新增 2. 删除 3. 统计 4. 清空 5. 隐藏 记事本功能 记事本有基本的增删改查等操作功能,输入框输入内容回车添加,每添加一条内容左下角就会增加一条记录 当想要删除 ...

  8. HOOK大法实现不修改程序代码给程序添加功能

    [文章标题]: HOOK大法实现不修改程序代码给程序添加功能 [文章作者]: 0x18c0 [软件名称]: Scylla [使用工具]: OD.Stub_PE.ResHacker [版权声明]: 本文 ...

  9. 使用C#设计一个Windows应用程序——记事本

    文章主要内容:通过本文介绍学习,可以进一步掌握MenuStrip(菜单).ToolStrip(工具栏).RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何 ...

  10. p系统ndows10的功能更新1903,Win10 1903到底有什么不同?Win10 1903更新内容汇总

    在2019年的四月,微软为Win10系统推送了19H1版本更新,也就是Win10 1903.作为一年两次的大版本更新,win10 1903有不少用户在关注,那么它有什么不同之处呢?到底更新了什么功能? ...

最新文章

  1. Swift类与OC类方法相互调用的
  2. 产品设计体会(6014)商业智能的尝试
  3. [转载]VS2005中ifstream不能读中文路径文件的bug
  4. 基于 Spring Boot 的车牌识别系统(附项目地址)
  5. [BZOJ2095]Bridges
  6. Flutter入门:Offstage和Visibility
  7. 数据的插入、更新、删除
  8. 60K!刚面完Python!这个被Oracle裁掉的程序员求职刷爆全网!
  9. 安装ugjava安装在哪里_南开区业销售避雷墩/哪里有安装的
  10. 【CS学习笔记】26、杀毒软件
  11. Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例
  12. layout_gravity和gravity的区分和应用
  13. 如何修改Kestrel上传文件的大小
  14. 用git来管理单机游戏存档
  15. python词云图库一般装多久_Python数据可视化:词云库的讲解和如何制作词云
  16. 服务和控制器应用CPU占用过高 根源问题彻底解决
  17. 下载pyboard的flash中的驱动程序_打印机驱动程序被标记为恶意软件 戴尔已紧急撤下链接...
  18. 数模混合仿真实例(数字verilog作为顶层)VCS+XA
  19. linux查看oracle线程,【实验】【PsList】使用PsList查看Windows上Oracle的线程等信息
  20. 2021年3季度手机银行活跃用户突破6.2亿,中小上市银行增长突出

热门文章

  1. edxp显示未安装_EPLAN因缺少加密狗驱动而无法安装解决方案
  2. Qt + GDAL 写入矢量图层 shp
  3. 十问组态软件:开源的组态软件
  4. 杰控组态西门子PLC
  5. windows批量上传文件到linux,windows上传文件到linux云服务器上
  6. python网易云歌词爬虫_用python爬取网易云音乐歌曲的歌词
  7. Linux下bzero函数
  8. 生物信息学的现状与展望
  9. Wonderwar-InTouch-配方配置
  10. 深入浅出数据分析pdf