电子设计工程
Electronic Design Engineering
第28卷Vol.28第24期No.242020年12月Dec.2020
收稿日期:2020-02-03
稿件编号:202002006
作者简介:孟令增(1997—),男,山东潍坊人,硕士研究生。研究方向:MES 系统开发。
Notepad ——记事本,是Windows 系统中自带的
一款小巧的纯文本编辑器,具有打开速度快,占用内存小,工作效率高等特点,在只记录纯文本文字时,记
事本成为最好用的软件之一,是现代电脑办公的得力助手[1]。在相同的文本情况下,使用微软OneNote [2]、World 和Notpad 保存的文件大小就不相同。因此,在只记录文本的情况下,应尽量选择记事本保存。本次开发的目的是创建一个文本编辑器,同时介绍Winform 中的属性、事件以及各种
控件的使用场景。开发的文本编辑器能够满足文字的编辑、修改、保存等基本操作,并且使用多文档界面开发,能同时记录多个事件,较为方便。开发使用的软件是Visual Studio 2019专业版本,开发语言为C#。
1开发环境和语言
VS 是Microsoft Visual Studio 的简称,是美国
Microsoft 公司推出的开发工具包。VS 基本包含了整
个软件开发周期中所需要的工具,是一个基本完整
基于.NET 的记事本设计
孟令增,王中训
(烟台大学光电信息科学技术学院,山东烟台264005)
摘要:记事本作为一款纯文本编辑器,以其小巧灵活获得了人们的青睐。为编写一款记事本程序,基于.NET 框架,结合Visal Studio 2019编程软件中的Winform 窗体程序,采用输入输出流、事件处理等
方法,编写了一个记事本程序并通过了运行。该记事本有打开、新建、保存、修改字号和字体、另存为等主要功能。最后,还对该程序进行了改进,加入了更符合人性化的对话框提示,可以判断用户是否修改过文本再进行关闭保存、另存为操作,使其更符合逻辑。此外,该程序采用多文档界面(MDI ),通过父窗体调用子窗体程序,使其可以一次性打开多个窗口,同时编辑。关键词:.NET ;Winform ;记事本;事件;多文档界面中图分类号:TN919
文献标识码:A
文章编号:1674-6236(2020)24-0076-05
DOI:10.14022/j.issn1674-6236.2020.24.016
Design of Notepad based on .NET
MENG Lingzeng ,WANG Zhongxun
(School of OPTO ⁃Electronic Information Science and Technology ,Yantai University ,Yantai 264005,China )Abstract:As a plain text editor ,Notepad wins people ’s favor with its small and flexible.To write a
Notepad program ,the paper is based on the.NET framework ,combined with the Winform program in Visal Studio 2019programming software ,using the input and output stream ,event processing and other methods ,wrote a Notepad program and successfully run.The Notepad has the main function such as
open ,new ,save ,modify the font size and font ,save as and so on.Finally ,this paper also improved the program ,adding a more humanized dialog box prompt ,it can determine whether the user has modified the text to close ,save and save as ,so that it is more logical.In addition ,the program adopts the Multiple Document Interface (MDI ),which calls the child form program through the parent form ,so that it can open multiple Windows at once and edit them at the same time.
Keywords:.NET ;Winform ;Notpad ;event ;Multiple Document Interface
的开发工具集,如代码管控工具、UML工具以及集成开发环境(IDE)等。具有良好的兼容性,其编写的代码适用于微软支持的所有平台。
随着.NET技术的发展,2002年Visual Studio.NET 应运而生。微软也为此引入了该框架的托管机制以及C#语言,用来编写.NET框架。C#也是建立在C++和Java基础上的语言。
C#语言是一种简单、现代、完全面向对象的编程语言[3],该语言基于.NET平台,先后被欧洲计算机制造协会和国际化标准组织批准为高级语言开发标准。近年来.NET技术不断发展,该语言已成为开发基于.NET的企业及应用程序的首选语言。
C#语言执行效率高,能使程序员快速便捷地创建基于Microsoft.NET平台的解决方案。这种框架可以使C#组件方便地转化为XML网络服务,从而任何平台的应用都可以通过互联网调用它。C#是当前比较流行的编程语言,不仅增强开发的效率,同时也致力于消除编程中导致的错误结果[4]。C#语言保持了开发软件所需要的强大性和灵活性,使程序员可以快速的进行各种软件和网络的开发。
2记事本的功能设计
1)子窗体
①新建:清空当前界面,打开一个新的文档。
②保存:鼠标单击时,对当前页面所编辑的文字全部保存在指定路径[5]。
③打开:鼠标单击时,选择要打开的文件路径,并将指定文件内容读入。
④加粗:将所选择的文字进行加粗。
⑤倾斜:将所选择的文字执行倾斜操作。
⑥字体:打开程序时,加载系统所有字体,可以实现修改字体的功能。
⑦字号:将所选文字大小改变。
2)父窗体
关闭:将当前处在激活状态的子窗体界面关闭。
关闭全部:将打开的所有子窗体全部关闭。
退出:释放所有内存,退出该程序。
3具体实现过程
3.1界面设计
3.1.1子窗体
启动Visual Studio2019pro,选择Visual C#中的
notepad++
窗体应用程序,重命名为Notpad并保存。因采用MDI设计方法,需建立子窗体和父窗体,父窗体调用子窗体程序。在解决资源方案管理器里新建两个窗体,命名为FormChild和FormParent。
工具箱中提供各种控件,.NET控件是.NET平台下对数据和方法的封装。包括所需的按钮(Button)、工具栏(toolStrip)、标签(Label)等。
首先设计子窗体。在属性栏到Text属性,改为“记事本”,即为子窗体名称。到工具箱,加入一个toolStrip,作为存放控件的容器。在工具栏里加入5个按钮,分别作为新建、保存、打开[6]、加粗和倾斜。再加入两个组合框,分别作为字体和字号。通过以下操作修改显示样式。其整体设计应遵循文本信息的集成统一与规范化[7]。
设计外观:利用Image属性添加按钮图片;显示样式设为图片和文本同时显示(ImageAndText);文本图像关系设为图在上文本在下(ImageAboveText);字号设为10,12,…,32号。最后,修改按钮和组合框名称,以方便后续使用。
ToolStripButtonOpen(打开按钮),ToolStrip ButtonSave(保存按纽),ToolStripButtonBold(加粗按钮),ToolStripButtonItalic(倾斜按钮),ToolStrip ComboboxFonts(修改字体),ToolStripComboboxSize (修改字号)。
加入滚动条,并且设为铺满。名称改为textBoxNote。子窗体界面设计完成,加入适当美化,使其界面风格美观统一[8]。子窗体界面如图1
所示。
图1子窗体界面
3.1.2父窗体
父窗体的设计思路与子窗体大致相同,不再赘述,不同之处在于父窗体加入了一个MenuStrip,并加入了新建、关闭、关闭全部、退出按钮的多选菜单栏[9]。父窗体界面如图2所示。
孟令增,等基于.NET的记事本设计
《电子设计工程》2020年第24
图2父窗体界面
3.2算法实现
通过算法实现按钮的功能。点击按钮时发生的改变称作“事件”,在属性中查事件类型,双击事件类型进入编程界面并写入程序。
子窗体:
1)字体。在窗体打开时,需将字体自动装载完成[10]。使用Load事件:每当用户加载窗体时发生。关键代码如下:
{ InstalledFontCollection myFonts=new Installed FontCollection();
FontFamily[]ff=myFonts.Families;//获取对象的数组
ArrayList list=new ArrayList();
int count=ff.Length;//获取系统数组的列表元素集合的长度
//使用for循环写入
for(int i=0;i<count;i++)
{
string FontName=ff[i].Name;toolStripComboBoxFonts.Items.Add(FontName);}
}
2)点击加粗按钮时,要对未加粗的字体执行加粗操作,否则恢复原字体。
{
if(textBoxNote.Font.Bold==false)
{
textBoxNote.Font=new Font(textBoxNote.Font,FontStyle.Bold);
}
else
{
textBoxNote.Font=new Font(textBoxNote.Font,FontStyle.Regular);
}
}
3)倾斜操作与加粗基本一致,不同之处在于将字体后面的枚举改为Italic。
4)当选择预加载的不同字体时,字体要发生改变。选择SelectedIndexChanged事件(选择的内容发生改变时),完成改变字体功能。
{
string fontName=toolStripComboBoxFonts.Text;float fontSize=float.Parse(toolStripComboBox Size.Text);
textBoxNote.Font=new Font(fontName,fontSize);}
5)选择SelectedIndexChanged事件(选择的内容发生改变时),完成改变字号功能。由于字体和字号属于同一个类(class),因此实现方法相同。
需要注意的是,不仅可以在下拉菜单栏选择字号,也可以直接在框中输入字号。因此需要加入一个文本改变事件。方法与上相同,不再赘述。6)保存需要用到的输入输出流[11],还要加入对话框的提示。在工具箱中打开SaveFileDialog工具[12]。由于是纯文本文件,需要创建筛选器来筛选.txt文件保存。在保存前需要判断是不是空文本,空文本不需要保存。实现代码如下:
{
if(textBoxNote.Text.Trim()!="")
{
//创建一个筛选器[13] saveFileDialog1.Filter=("文本文档(*,txt)|*. txt");
if(saveFileDialog1.ShowDialog()==DialogResult. OK)
{
string path=saveFileDialog1.FileName;
//保存文件streamWritersw=new StreamWriter(path,false);sw.WriteLine(textBoxNote.Text.Trim();this.Text=path;//把保存的路径显示在窗体上方sw.Flush();//释放资源
sw.Close();
}
}
else
{MessageBox.Show("空文档","提示",Message BoxButtons.OK,MessageBoxIcon.Error);
}
}
7)打开时需要选择打开路径。在工具箱中打开OpenFileDialog工具,作为选择打开时弹出的对话框。{
openFileDialog1.Filter=("文本文档(*,txt)|*. txt");
//判断用户点击打开按钮还是取消按钮
if(openFileDialog1.ShowDialog()==DialogResult. OK)
{//获取打开的路径
string path=openFileDialog1.FileName;StreamReader sr=new StreamReader(path,Encoding.UTF8)[14];
string text=sr.ReadToEnd();//读取文档中的数据流
textBoxNote.Text=text;
sr.Close();
}
}
父窗体:
1)当点击新建按钮时,父窗体会调用一个子窗体,即编辑窗口。关键代码如下:
{
FrmChild child=new FrmChild();//实例化一个子窗体对象
child.MdiParent=this;
child.Show();
}
2)点击关闭时,关闭当前被激活的子窗体程序。{
Form frm=this.ActiveMdiChild;
frm.Close();
}
3)点击关闭全部时,关闭所有打开的子窗体。{
foreach(Form form in this.MdiChildren)
{
Form frm=this.ActiveMdiChild;
frm.Close();
}
}
4)点击退出时,关闭程序。
{this.Close();}
3.3算法完善
1)保存时,需要判断是否为新打开文件。若是,选择保存路径[15];若不是,原路径保存。在子窗体的顶部显示文件打开路径,保存时若路径为空,则是新打开文件,选择路径保存,否则原路径保存。保存完毕后将路径显示在顶部。
else
{
string path=this.Text;//获取用户选择的文件及
路径
StreamWriter sw=new StreamWriter(path,false);//保存文件
sw.WriteLine(textBoxNote.Text.Trim());sw.Flush();
sw.Close();
}
2)若用户修改文档,需在点击关闭按钮时提示用户保存[16]。加一个组合框,当用户编辑文本时显示“*”,新打开的文件和保存后的文件无显示。关键代码为:
{ toolStripLabelMake.Text="*";
}
关闭窗口时,判断是否为“*”。使用FormClosing 事件。
{
if(toolStripLabelMake.Text=="*")
{
DialogResult dr=MessageBox.Show("文档未保存,确定要退出吗?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question);
if(dr==System.Windows.Forms.DialogResult.Yes)//若选择确定
{
孟令增,等基于.NET的记事本设计
《电子设计工程》2020年第24期
this.Dispose ();}else
{e.Cancel =true ;
}}}
3)当前文件若已经保存,直接退出即可,在保存文件完毕后清空组合框的“*”。保存效果图如图3所示,退出效果图如图4
所示。
图3
保存效果图
图4退出效果图
4结论
通过测试,程序运行稳定,可以完成在前文中提出的功能。而且经过对图形和文字的美化,具有良好的视觉体验;对话框的加入,也使用户体验更加良好。由于使用微软公司的软件编写,与Windows 系
统也具有良好的兼容性,可以实现各软件的复制粘贴,通过该记事本保存的.txt 文件可以被系统识别并被其他软件打开。本程序应用到的编程知识较多,包括IO 输入输出流、事件、对话框、对象实例化等,对C#语言以及窗体应用有很好地帮助。后续也会继续丰富记事本功能。
参考文献:
[1]张会.基于Java 的记事本程序的设计与实现[J].电脑知识与技术,2017,13(30):88-90.
[2]张明弟,朱守业,陈忍.基于OneNote 的大学生个人
知识管理[J].中国教育技术装备,2013(12):112-115.
[3]张浩.C#语言跨平台研究与实践[J].电脑知识与技术,2019,15(13):109-112.
[4]郑明秋.基于C#语言的面向对象编程特征研究与实现[J].通讯世界,2015,280(21):270-271.[5]夏庆英.Java Swing 之记事本制作[J].中小企业管理与科技(中旬刊),2015(12):213.[6]苏腊梅.Java 开发日历记事本[J].电脑知识与技术,
2010,6(34):9762-9764.[7]李水佳,吴文高,刘瑞严.基于Android 的超级记事
本APP 设计[J].电脑知识与技术,2016,12(10):79-80,87.
[8]缪平,朱晓辉,丁浩,等.WinForm 界面统一管理方法研究[J].软件导刊,2017,16(9):1-3.
[9]阿楠.记事本与命令联合制作多选菜单[J].电脑爱好者,2017(20):31.
[10]任琴,刘毅,孔令慧.基于java 语言的windows 记事本的设计[J].科技风,2017(11):79.[11]吴金秀.Winform 窗体之间传值方法探究[J].广东蚕业,2017,51(4):43-44.[12]王志军.利用记事本实现行首添加固定字符[J].电脑知识与技术(经验技巧),2015(6):41.[13]汪杰. 框架下的软件开发模式[J].电子技术与
软件工程,2017(3):57.[14]陈凯.彩斑斓的记事本[J].中国信息技术教育,2016(5):27,44,58.[15]钱毅,刘力超.数据库电子文件归档与长期保存技术路径研究[J].档案学研究,2017(4):67-72.
[16]任亚捷.基于Android 的多功能记事本软件的设
计与实现[J].工业控制计算机,2017,30(4):101-102.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。