文章目录

  • 一、描述
  • 二、记事本简介
  • 三、记事本界面设计
    • (1)界面设计
  • 四、程序代码
    • (1) 多格式文本框代码(RichTextBox)
    • (2) 菜单代码
    • (3) 关于记事本
    • (4) 工具栏代码
    • (5) 计时器代码
  • 五、运行效果
  • 六、总结

一、描述

本博客介绍如何使用Visual Studio 2019设计一个Windows应用程序——记事本,通过学习,可以进一步掌握MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取、格式设置等操作。(说明:所有代码必须在英文状态下使用!)

二、记事本简介

记事本是一种常用的软件,在微软的Windows中,自带了一个记事本软件,Windows 10下的记事本软件如下图所示。

本博客介绍的记事本,实现了Windows自带的记事本的部分功能外,并且还可以任意更改字体的字体类型、大小和颜色,并在状态栏中显示时间。为了方便用户的操作,还在程序的窗体上放置了一个工具栏。
本章介绍的记事本程序具有文件的新建、打开、保存功能;文字的复制、粘贴、删除功能;字体类型、格式的设置功能;查看日期时间等功能,并且用户可以根据需要显示或者隐藏工具栏和状态栏。
接下来将详细的介绍记事本程序的设计与实现的步骤和方法。

三、记事本界面设计

新建一个Windows窗体应用程序,并命名为“Notepad”
更改窗体名称 单击窗体, →右下角属性→text 修改为“记事本”如图所示

按下表设置剩下的窗体属性


(1)界面设计

新建好“Notepad”项目后,定位到记事本程序的窗体设计器窗口,然后依次在窗体上放置以下控件(各1个):
(1)MenuStrip(菜单控件)。

1.单击窗体左边会出现工具箱→ 找到menustrip →拖动到窗体中

2.单击菜单栏→右下角属性→修改Name属性为“mnusNotepad”

3.单击 输入【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】如图所示

4.设置【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】的属性→
单击【文件(F)】、【编辑(E)】、【格式(O)】、【查看(V)】和【帮助(H)】找到对应的属性窗口,按照以下表格进行设置

(2) ToolStrip(工具栏控件)。

1.单击窗体左边会出现工具箱→ 找到“ToolStrip” →拖动到窗体中

2.单击工具栏→右下角属性→修改Name属性为“tlsNotepad”

3.右击工具栏→ 插入标准项 出现如图所示

4.右击工具栏→ 编辑项 可以看到我们的按钮成员 在这里我们可以删除或者增加,为了新手学习,我们只设置几个简单的功能(新建,打开,保存,剪切,粘贴,复制)。其它我们不再设置。

为了看起来直观,这个我们不更改它们的Name属性了。

(3) RichTextBox(多格式文本框控件)。
1.单击窗体左边会出现工具箱→ 找到“RichTextBox” →拖动到窗体中

2.单击工具栏→右下角属性→修改Name属性为“rtxtNotepad”

3.Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变,如图所示。

(4) StatusStrip(状态栏控件)。
1.添加StatusStrip控件,将其Name属性设为“stsNotepad”,将Dock属性设为“Bottom”再将Anchor属性设为“Top, Left”。

2.然后单击 右边的 按钮,打开【项集合编辑器】对话框。

下拉列表中保留默认的选择“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秒钟改变一次时钟。

最终设置界面如下图所示到此,用户界面设计完毕,接下来介绍具体的实现过程及源代码的编写。

四、程序代码

首先在代码的通用段声明以下两个公共变量,他们都是布尔型的,“b”用于判断文件是新建的还是从磁盘打开的,“s”用于判断文件是否被保存。
双击窗体,进入代码区填写以下代码

//*************************************************************************
/* 布尔变量b用于判断文件是新建的还是从磁盘打开的,true表示文件是从磁盘打开的,false表示文件是新建的,默认值为false*/
bool b = false;
/* 布尔变量s用于判断文件件是否被保存,true表示文件是已经被保存了,false表示文件未被保存,默认值为true*/
bool s = true;
//*************************************************************************

如图所示:

接下来编写多格式文本框(rtxtNotepad)、菜单(mnusNotepad)、工具栏(tlsNotepad)、计时器(tmrNotepad)对象的程序代码。

(1) 多格式文本框代码(RichTextBox)

当多格式文本框中的文本发生改变后,应当设置布尔变量“s”的值为false,表示文件未保存,因此编写多格式文本框的TextChanged事件代码如下:
双击RichTextBox,进入代码区填写以下代码

private void rtxtNotepad_TextChanged(object sender, EventArgs e)
{// 文本被修改后,设置s为false,表示文件未保存s = false;
}

(2) 菜单代码

在本博客的记事本程序中,几乎所有的功能都是通过菜单来实现的,本小节将介绍各菜单项的单击事件代码

1.【文件(F)】菜单
【文件(F)】菜单的功能是完成文件的新建、打开、保存、另存为功能,以及退出记事本程序,下面对各个菜单项的源代码进行说明。

(1) 【新建(N)】菜单项
双击“新建“,进入代码区填写以下代码

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) 【打开(O)】菜单项

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) 【保存(S)】菜单项

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) 【另存为(A)】菜单项

private void tsmiSaveAs_Click(object sender, EventArgs e)
{if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);s = true;}
}

(5) 【退出(X)】菜单项

private void tsmiClose_Click(object sender, EventArgs e)
{Application.Exit();//程序结束
}

2.【编辑(E)】菜单
【编辑(E)】菜单用于完成撤销(撤销最近一次对文本框的编辑操作)、复制(复制选中的文本内容)、剪切(剪切选中的文本内容)、粘贴(粘贴剪贴板中的内容)、全选(选中多格式文本框中所有的内容)以及将当前日期追加至文本文件的功能。【编辑(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());//显示当前日期
}

3.【格式(O)】菜单
【格式(O)】菜单用于设置打开或新建的文本内容是否自动换行,以及设置字体的格式功能。
(1) 【自动换行(W)】菜单项
此菜单项的Checked属性默认为“True”,文本内容按照文本框的宽度自动换行,否则只按段落标记换行,【自动换行(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)】菜单项
单击此菜单项时,弹出字体对话框以调整选择内容的字体、颜色等属性。因此需要使用前面添加的FontDialog控件来实现。【字体(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;}
}

4.【查看(V)】菜单
【查看(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;}
}

5.【帮助(H)】菜单
本菜单只有一个菜单项【关于记事本(A)】,该菜单项调用一个窗体(frmAbout)显示本程序的一些相关信息。并用LinkLabel控件设置链接,通过它可以方便地给作者发送E-Mail。frmAbout窗体的设计将在下一小节(关于记事本)中详细的介绍。

设计好frmAbout窗体后,为了显示该窗体,需要编写【关于记事本(A)】菜单项的单击事件代码如下:

private void tsmiAbout_Click(object sender, EventArgs e)
{frmAbout ob_FrmAbout = new frmAbout();ob_FrmAbout.Show();
}

(3) 关于记事本

接下来单击【项目】→【添加Windows窗体】菜单项,添加一个名为“frmAbout”的窗体,如图所示。

  1. 界面设计
    然后给窗体“frmAbout”添加几个Label、Button、LinkLabel控件,如图所示。

    【关于记事本】窗体和窗体上各控件的属性设置如表所示。
  2. 编写代码
    本部分的代码很简单,单击【确定】按钮关闭本窗体。并且利用LinkLabel控件
    代码如下:
// 【确定】按钮
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”);
}

(4) 工具栏代码

工具栏提供了一些快捷按钮,用来方便用户的操作,用户按下按钮时相当于选择了某个菜单项,用switch语句实现如下,双击工具栏的空白部位,编写工具栏的ItemClicked事件代码如下:

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;*/ // 我们不用case3case 5:tsmiCut_Click(sender, e);break;case 6:tsmiCopy_Click(sender, e);break;case 7:tsmiPaste_Click(sender, e);break; // 我们不用case6case 9:tsmiAbout_Click(sender, e);break;}
}

(5) 计时器代码

要在状态栏的tssLbl2中显示当前时间,需要编写计时器控件的Tick事件(每秒钟触发一次)代码如下:

private void tmrNotepad_Tick(object sender, EventArgs e)
{tssLbl2.Text = System.DateTime.Now.ToString();
}

五、运行效果


六、总结

老师给的文档基本完整,跟着走就可以。工具栏代码中的变量n有些小问题,发现工具栏中的“|”也代表了一个数字,所以n要相应地加1或者2,才能使n对应上工具栏中的图标。

用C#语言实现记事本(Windows程序设计作业3)相关推荐

  1. 【Windows程序设计作业1】C#模拟信用卡还款

    功能说明: 信用卡还款是银行系统的重要业务,业务流程说明如下: 用户有信用卡和储蓄卡,储蓄卡有查询余额和取款功能,信用卡能够查看账单金额.查看还款日和查看余额三个功能: 请使用委托与事件实现下列功能: ...

  2. windows程序设计作业

    //dropna返回一个仅含非空数据和索引值的Series from pandas import Series,DataFrame from numpy import nan as NA   data ...

  3. Windows程序设计作业1

    功能说明:用户有信用卡和储蓄卡,储蓄卡有查询余额和取款功能,信用卡能够查看账单金额.查看还款日和查看余额三个功能:用户可自由设置信用卡还款关联的储蓄卡,当还款日到期时进行账单金额的自动划扣: 流程设计 ...

  4. Windows程序设计作业一——信用卡还款

    一.题目 1.信用卡还款是银行系统的重要业务,业务流程说明如下: 2.用户有信用卡和储蓄卡,储蓄卡有查询余额和取款功能,信用卡能够查看账单金额.查看还款日和查看余额三个功能: 3.请使用委托与事件实现 ...

  5. C语言程序设计作业——摘苹果

    C语言程序设计作业--摘苹果 摘苹果 #include<stdio.h> #include<stdlib.h> #include<time.h> #include& ...

  6. 代写python代码一般多少钱_代写CO 353课程作业、代做Python程序设计作业、代写Python语言作业...

    代写CO 353课程作业.代做Python程序设计作业.代写Python语言作业 日期:2020-03-17 11:22 CO 353 - Homework assignment 4 Winter ' ...

  7. 北京大学c语言试题及答案,北大网络教育(计算机专业)C程序设计作业答案

    北大网络教育(计算机专业)C程序设计作业答案 第一章作业 一.将数150.10.75.50.375用十六进制表示 150=96:10.75=A:50.375=32 150(十进制)=96(十六进制) ...

  8. 代写php代码作业,代写phpmyadmin留学生作业、代做SQL语言作业、SQL程序设计作业调试、代做PHP script作业...

    代写phpmyadmin留学生作业.代做SQL语言作业.SQL程序设计作业调试.代做PHP script作业 日期:2019-04-20 01:17 Overview:In this assignme ...

  9. c语言程序设计个人作业,C语言程序设计-作业集.doc

    C语言程序设计-作业集 目 录 作业一2 作业二4 作业三9 作业四13 作业五19 作业六27 作业七36 作业八45 作业九47 作业十51 作业十一55 作业一 一.查找相关资料,回答下列问题 ...

最新文章

  1. MailMail、RegeX等程序的云端版
  2. 记linux_centOS安装as86过程
  3. C#调用webservice(二)
  4. Python《使用Selenium实现自动化操作》
  5. windows使用WSL安装linux子系统
  6. 第 12 章 组合模式
  7. docker 安装 MySQL 8,并减少内存占用 记录
  8. Memory Management (内存管理)
  9. 图像几何运算——Matlab实现
  10. 如何自己制作一个GIF微信表情
  11. 计算机中怎样重新安装ps,什么样的电脑适合安装高版本Photoshop?该如何安装和卸载PS呢?...
  12. 陈省身文集53——大范围微分几何若干新观点
  13. 使用AudioRecorder录音
  14. 《暗时间》----读书笔记
  15. (经验贴)如何在Word里实现手写签名
  16. 华东师范大学 计算机 博士 毕业论文,华东师大:1/4博士生完不成论文难毕业
  17. Java 设置Word页边距、页面大小、页面方向、页面边框
  18. 12月18日23点,2022年卡塔尔世界杯决赛,阿根廷对阵法国,上演巅峰对决,谁能捧走大力神杯?
  19. Mac无法安装第三方软件
  20. python之API接口调用

热门文章

  1. android WebView截长图实现
  2. 透明状态栏(StatusBar)的全适配
  3. java模拟加速匀速减速_步进电机加速-匀速-减速运行程序(C51源程序)
  4. Postgresql wal日志
  5. 荣耀10GT AIS手持超级夜景样张解析,拍照最Skr的手机!
  6. jdbc 连接Oracle数据库保存图片
  7. 云服务器部署springboot项目
  8. PLSQL查询中文乱码
  9. Facebook Instant Game 设置智能助手
  10. JProfiler SN