一、功能说明

编写一个C#程序实现记事本的各项功能。如文件的新建、打开、保存功能;文字的复制、粘贴、删除功能;字体类型、格式的设置功能;查看日期时间等,并且用户可以根据需要显示或者隐藏工具栏和状态栏。
大体效果图

二:界面设计

(1)MenuStrip(菜单控件)。
单击窗体左边会出现工具箱→ 找到menustrip →拖动到窗体中
单击菜单栏→右下角属性→修改Name属性为“mnusNotepad”
单击mnusNotepad输入(文件(F)、编辑(E)、格式(O)、查看(V)、帮助(H))
单击文件(F)输入(新建(N) Ctrl+N、打开(O) Ctrl+O、保存(S) Ctrl+S、另存为(A)、退出(X))
单击编辑(E)输入(撤销(V) Ctrl+Z、复制© Ctrl+C、剪切(T) Ctrl+X、粘贴§ Ctrl+V、全选(A) Ctrl+A、日期(D) F5)
单击格式(O)输入(自动换行(W)、字体(F))
单击查看(V)输入(工具栏(T)、状态栏(S))
单击帮助(H)输入(关于记事本(A))

属性设置:
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属性 Checked属性
格式(&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控件的Name属性设为“tmrNotepad”,Enabled(激活的可行的)属性设为“True”,Interval(间隔,间距,幕间时间)属性设为“1000”,表示1秒种触发一次Tick事件,即1秒钟改变一次时钟

最终效果如图,界面设计完成

三:编写程序代码

1.通用段说明:
首先在代码的通用段声明以下两个公共变量,他们都是布尔型的,“b”用于判断文件是新建的还是从磁盘打开的,“s”用于判断文件是否被保存。

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

2.多格式文本框代码
当多格式文本框中的文本发生改变后,应当设置布尔变量“s”的值为false,表示文件未保存,因此编写多格式文本框的TextChanged事件代码

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

3.菜单代码
(1)【文件(F)】菜单

【新建(N)】菜单项

private void rtxtNotepad_TextChanged(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;}}}
}

【打开(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;
}

【保存(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;}
}

【另存为(A)】菜单项

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

【退出(X)】菜单项

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

(2)【编辑(E)】菜单

 private void tsmiUndo_Click(object sender, EventArgs e){rtxtNotepad.Undo();//撤销}
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 复制CCtrlCToolStripMenuItem_Click(object sender, EventArgs e){rtxtNotepad.Copy();//复制}

(3)【格式(O)】菜单
【自动换行(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;}
}

【字体(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)】菜单
【工具栏(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;}
}

【状态栏(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)】菜单
【关于记事本】菜单项

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

3.关于记事本
接下来,添加一个名为“frmAbout”的窗体,如图
给窗体“frmAbout”添加几个Label、Button、LinkLabel控件。
属性设置:
Form Form2 :
Name:frmAbout
Text:关于记事本
StartPosition:CenterScreen
MaximizeBox:False
AutoSizeMode:GrowAndShrink
Button Button1:
Name:btnOk
Text:确定
Label Label1:
Text:多功能记事本
LinkLabe LinkLabel
Text:如有问题,点击这里

代码

namespace frmAbout
{public partial class frmAbout : Form{public frmAbout(){InitializeComponent();}private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){System.Diagnostics.Process.Start("http://www.baidu.com");}private void btnOK_Click(object sender, EventArgs e){this.Close();}}
}

4.工具栏

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;}
}

5.计时器

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

四:运行结果


经测试功能正常。

使用C#语言编写记事本程序相关推荐

  1. python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...

    导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...

  2. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc

    实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...

  3. 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。

    展开全部 C语言编写一程序求解32313133353236313431303231363533e78988e69d8331333365643661一元二次方程的根: #include #include ...

  4. 心碎的图案怎么用c语言编出来,教案实验2用c语言编写简单程序.doc

    教案实验2用c语言编写简单程序 实验2 用C语言编写简单程序 2.1 基本数据处理1.调试示例 改正下列程序中的错误,求华氏温度100oF对应的摄氏温度?计算公式如下,其中:c 表示摄氏温度,f 表示 ...

  5. 用 C 语言编写的程序被称为,用c语言编写的程序被称为

    快速导读: Q1:用C语言编写以下程序 #includeintmain(void){ intm,n,i,t; printf("InputM,N(int0if(scanf("%d%d ...

  6. 用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)

    用PL/SQL语言编写一程序,实现按部门分段(6000以上.(6000,3000).3000元以下)统计各工资段的职工人数.以及各部门的工资总额(工资总额中不包括奖金) 输出到一张表中 直接输出在屏幕 ...

  7. c语言万年历代码作业,用c语言编写万年历程序

    用c语言编写万年历程序 <C 程序设计>课程设计报告 2011-2012学年第二学期 设计题目:万年历的设计 指导教师: 李素若 完成时间:2012 年 6月 1日至 2011年 6月 2 ...

  8. 计算机编写的程序具有可移植性,用高级程序设计语言编写的程序()。A.计算机能直接执行B.可读性和可移植性好C.可读性差但执行效率...

    用高级程序设计语言编写的程序().A.计算机能直接执行B.可读性和可移植性好C.可读性差但执行效率 更多相关问题 有些消费函数表明,收入和消费是负相关的.() 地球上陆地的面积约为148 000 00 ...

  9. c语言 465串口编程,用C语言编写串口程序

    在当今,流行的编程软件种类繁多,它们编程方便.易于维护,但是在与硬 件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地.C语言 作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高 ...

最新文章

  1. 找回 macOS Sierra 中的“任何来源”选项
  2. boost::hana::overload用法的测试程序
  3. 三年级人教版下学期计算机教案,人教版三年级下册信息技术教案
  4. docker ps 和docker ps -a
  5. java excel 导出图片_JAVA 使用 POI 导出 EXCEL 自定义背景颜色
  6. 解决 Visual Studio 中代码注释自动折叠的问题
  7. ubuntu20.10下mysql8数据库的安装(亲测)
  8. 爬虫运行成功但没数据_我整来了几台服务器,就是为了给你演示一下分布式爬虫的整个过程...
  9. java调用百度api完成人脸识别
  10. 眼图Matlab初学者代码
  11. 如何安装Junit4
  12. 小程序开发需要多少钱?
  13. 社交产品分析:共同看片,微光
  14. 阿里云系统导出到本地虚拟机
  15. 合并b站m4s格式的音视频轨道
  16. Linux C多人网络聊天室
  17. (二)国内云计算行业 技术与发展概述
  18. for循环倒序java_for循环
  19. Eureka搭建三台集群
  20. status code = 404, status message = [Not Found]

热门文章

  1. 使用reCAPTCHA实现验证码
  2. sqlserver数据驱动bao1_自动切换数据源 - 一个人看日出,一个人看夕阳,一个人走路,一个人欢笑 - OSCHINA - 中文开源技术交流社区...
  3. 华为首发商用5G芯片,不过在技术方面其实还是落后于高通的
  4. windows7系统损坏修复_重装系统是选择 ghost win7 还是原版 win7_windows7教程
  5. 电视台以IPTV系统为载体扩展融媒体解决方案
  6. spark源码解析:2.2 start-daemon.sh脚本分析
  7. 虚化背景 - 基于镜头模糊滤镜的深度映射
  8. 纽约大学计算机学,纽约大学计算机科学硕士
  9. 使用python_openslide剪切大型tif图
  10. [Study]Git