基于C#的简单记事本开发

person 匿名

发布日期: 2021-03-10 07:41:03 浏览量: 178
评分:
star star star star star star star_border star_border star_border star_border
*转载请注明来自write-bug.com

注意!!!:由于很久之前写的,害,我也找不到源码了,并且当时写的也不太好,给大家找了一个写的完整且更值得学习的“C#-记事本”版本的源码,可以通过下面的任一链接下载,这里感谢原作者Lavertis。

链接:https://pan.baidu.com/s/182sDGSjzGznNmyJNZTzbHA 提取码:j03l
? 原作者github仓库:https://github.com/Lavertis/simple-notepad
我使用了Visual Studio 2013编译并顺利运行(网盘的版本修复了一些小问题)。如果大家遇到什么麻烦或哪地看不懂,直接私信我,杏肝学长,在线解答~

概述

这里主要是模仿记事本的简单功能,因为实际一个记事本的功能还是相当多的,包括改变字体、查找、改变颜色等等。这里主要实现记事本装载文件、保存文件及快捷键设置等功能。如果想编写一个功能齐全的记事本应用可以在其基础上扩展功能模块,只要对C#进一步学习,扩展并非难事。

代码的大部分注释十分详尽,我尽可能少说废话。让你感受到自己理解程序过程中的喜悦。下面我们开始!

最终实现效果

涉及到的C#控件

用C#的可视化编程是十分方便的,不需要陷入Windows编程的漩涡中。这个小项目用到的控件‘屈指可数’,主体编辑区(或叫客户区)是一个RichTextBox(丰富文本框),另外的控件看下面的图片吧!

没错,是些对话框控件和菜单控件,因为我们在记事本的底边加了个电子表(什么你没看到?),所以我们需要一个Timer控件,至于菜单中更细化的组成部分则在下图中。(让我偷点懒~~)

绿亮色的部分就是控件及控件内条目(item)的名称,你可以通过这个接触这些控件,如果这些你早已知晓,只是想看看是怎么实现操纵文件的,那直接看代码就好了,不需要读这些浪费时间。

当然,如果你还想知道更多的控件和使用方式,我特意准备了C#控件手册,通过手册内容及亲自实现,完整项目的的实现指日可待!

C#控件大全.pdf下载链接(百度网盘):链接:http://pan.baidu.com/s/1miGa8re 密码:v2yh

编写过程中几个值得注意的地方:

  • 文件的保存与另存为操作方式不同:如果我用编辑器新建一个文件让后保存它,此时应该跳出一个保存文件的对话框,但是如果是用编辑器打开一个已经存在的文件,这个时候的保存是不弹出对话框的,但是另存为仍然需要弹出对话框,对于这个的我的实现方式是:在保存选项event中,加了个if判断,如果文件名长度大于0(打开原有文件的情况),则直接保存,否则(新建的情况),执行另存为选项的操作

  • richTextBox1.LoadFile(filename, RichTextBoxStreamType.PlainText);装载文件时的函数的第一个参数是Path(即路径):所以filename的由来应该是

    1. filename = openFileDialog1.FileName;

    这个函数很容易被代码提示混淆而用错,值得注意!

  • 定时器的使用格式:因为是直接用控件生成定时器,所以只需要在class开头初始化即可

    1. timer1.Enabled = true;
    2. timer1.Interval = 1000; (以毫秒为单位)

    并且在相应函数中刷新显示的时间

    1. this.toolStripStatusLabel1.Text = “系统当前时间:” + DateTime.Now.ToString();

下面给出cs文件中的源码

  1. namespace Editor
  2. {
  3. public partial class Form1 : Form
  4. {
  5. string filename = ""; //定义并初始化下文的文件名
  6. public Form1()
  7. {
  8. InitializeComponent();
  9. //初始化定时器
  10. timer1.Enabled = true; //定时器的可见性
  11. timer1.Interval = 1000; //定时器的时间间隔设置为1000ms
  12. this.toolStripStatusLabel1.Text = "系统当前时间:" + DateTime.Now.ToString();
  13. }
  14. private void toolStripMenuItem6_Click(object sender, EventArgs e)
  15. {
  16. //点击此选项,关闭窗口并退出程序
  17. this.Close();
  18. Application.Exit();
  19. }
  20. private void toolStripMenuItem2_Click(object sender, EventArgs e)
  21. {
  22. //新建选项
  23. richTextBox1.Clear(); //清空丰富文本区
  24. filename = ""; //开始的文件名为空
  25. this.Text = "无标题-EditorPrimer"; //初始化文件标题
  26. }
  27. private void toolStripMenuItem3_Click(object sender, EventArgs e)
  28. {
  29. //打开文件选项,调用openFile对话框
  30. openFileDialog1.Filter = "文本文件 | *.txt"; //设置文件类型过滤器
  31. openFileDialog1.FilterIndex = 1; //设置文件对话框中当前选中文件筛选器的索引
  32. openFileDialog1.InitialDirectory = "E:\\"; //设置文件对话框显示的初始目录
  33. if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  34. {
  35. //如果点击了确定按钮,更新文件名并向丰富区装载相应文本
  36. filename = openFileDialog1.FileName;
  37. //参数:需要装载的文件名以及装载的文本格式,这里指定纯文本
  38. richTextBox1.LoadFile(filename, RichTextBoxStreamType.PlainText);
  39. this.Text = filename + "-EditorPrimer"; //更新窗口标题栏
  40. }
  41. }
  42. private void toolStripMenuItem4_Click(object sender, EventArgs e)
  43. {
  44. //保存选项实现代码
  45. if(filename.Length > 0) {
  46. //文件名不是空,原来已经有此文件则直接保存
  47. richTextBox1.SaveFile(filename, RichTextBoxStreamType.PlainText);
  48. }
  49. else
  50. {
  51. //文件名是空,属于新建的文件,调用另存为事件
  52. toolStripMenuItem5_Click(sender, e);
  53. }
  54. }
  55. private void toolStripMenuItem5_Click(object sender, EventArgs e)
  56. {
  57. //另存为选项,代码与打开文件选项类似
  58. saveFileDialog1.Filter = "文本文件 | *.txt"; //设置保存文件类型过滤器
  59. saveFileDialog1.FilterIndex = 1; //文件对话框中当前选定筛选器的索引
  60. saveFileDialog1.InitialDirectory = "E:\\"; //保存文件时的默认目录
  61. if(saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
  62. //点击了保存文件对话框的确定按钮
  63. filename = saveFileDialog1.FileName; //更新文件名
  64. //保存文件,参数分别是文件的路径path 和文件的类型(这里指定为纯文本)
  65. richTextBox1.SaveFile(filename, RichTextBoxStreamType.PlainText);
  66. //获取文件保存路径并更新窗口标题栏
  67. int index = filename.LastIndexOf('\\'); //找到最后一个斜线的下标索引
  68. string Text_2 = filename.Substring(index + 1); //去掉文件路径获取文件名(参数下标索引,截取长度(不指定直到最后))
  69. this.Text = Text_2 + "-EditorPrimer"; //更新标题栏
  70. }
  71. }
  72. private void timer1_Tick(object sender, EventArgs e)
  73. {
  74. //每隔1000m更新一次时间数据达到动态电子表的效果
  75. this.toolStripStatusLabel1.Text = "系统当前时间:" + DateTime.Now.ToString();
  76. }
  77. }
  78. }

在程序的菜单栏中有许多其他选项,这些在这里都没有实现,但是其实现的流程都是相同的,之后我会通过新的知识继续补充,也希望大家可以踊跃交流!

源文件及相应的资源下载链接:
链接:http://pan.baidu.com/s/1dEDqFTZ 密码:tboi
后序博文扩展记事本功能(下)文章链接:http://blog.csdn.net/weixin_37818081/article/details/78587196
————————————————
版权声明:本文为CSDN博主「razor521」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37818081/article/details/78532312

上传的附件 cloud_download simple-notepad.zip ( 2.33mb, 5次下载 )

热门回复

  • 线程同步之临界区
    程序还算比较简单的,谢谢分享
    2019-04-20 12:24:58 thumb_up( 1 )
  • 基于WinPcap实现的UDP发包程序
    如果在vs 编译时出现 无法找到元数据文件 platform.winmd 应该怎么解决
    2021-03-23 09:58:16 thumb_up( 2 )
  • 机器视觉MIL Mod匹配
    You can also search within the full angular range of 360� from the nominal angle specified with M_ANGLE. Use the MmodControl()�M_ANGLE_DELTA_POS and M_ANGLE_DELTA_NEG control types to specify the angular range in the counter-clockwise and clockwise direction from the nominal angle, respectively; the default for both is 180�. The angular range limits the possible angles which can be returned as results for an occurrence. Note that the actual angle of the occurrence does not affect search speed. If you need to search for a model at discrete angles only (for example, at intervals of 90 degrees), it is typically more efficient to define several models with different expected angles, than to search through the full angular range. By default, calculations specific to angular-range search strategies are enabled. If you expect that the occurrences sought are close to the specified nominal angle, you can disable these calculations using MmodControl() with M_SEARCH_ANGLE_RANGE set to M_DISABLE. When disabled, you must specify a good nominal angle for each model, which is within the model's angular range. You can restrict which candidates are returned as occurrences by narrowing the angular-range. Note that M_SEARCH_ANGLE_RANGE must be enabled to search for a rotation-invariant non-synthetic model (for example, an image-type model of a circle).
    2021-03-20 13:27:51 thumb_up( 2 )
  • 基于SSM的超市订单管理系统
    可以用吗,怎么用的
    2021-04-14 15:44:50 thumb_up( 1 )
eject