天天看点

C#Winform - 记事本简述

简述

距离上次发博有挺长时间了,emmmm这次写这个程序呢纯粹是为了练练手,了解部分的控件的属性及事件,再者就是试下逻辑组合,鉴于一开始就没打算做多复杂,所以程序主打的是简洁风格,功能也比较简洁,基本上都能用的上。

文末会附打包好的程序安装包上去~

一、功能一览

这里我用思维导图把功能都罗列出来,需要提示的大概的逻辑,点之类的也注释了,直接看图:

C#Winform - 记事本简述

二、程序界面&控件布局

写这篇博客至少也能让初学者明白(以前写博也是持这个态度),所以会尽可能的说明~ ,部分未说明的一方面是想让阅读者自己能够好好思考某个点,一方面是觉得比较简单,没必要再赘述一番,另一方面是环境不允许,得上下文明白了在串联起来就比较容易理解

C#Winform - 记事本简述
菜单栏使用的是menuStrip;你观察过微软的记事本后,会发现菜单里某一项与另一项有一条浅浅的分割线,在键入内容时鼠标右键->插入->Separator就可以出效果了。

继续…….

文本输入使用了richTextBox,它比textBox功能更多些,支持.rtf格式,textBox该有的功能,事件,richTextBox基本上都有。

窗体底部采用控件是:statusStrip ,拖完控件在添加项即可添加内容

三、注意点

- 文本框会随窗体的大小变化而变化

//用了窗体的Resize事件,想法比较简单,当窗体大小变化时,文本框的大小也跟着变化
//这里以我的代码为例:
private void Form1_Resize(object sender, EventArgs e)
{
    richTextBox1.ClientSize=new Size(this.ClientSize.Width,this.ClientSize.Height);
}
           

- 啥时候保存(逻辑)

新建、打开、关闭窗体这些功能有个共通点:在点击需要执行的功能,都必须得检查当前窗口文本是否被修改,如果被修改则需要保存至对应的路径(针对已保存文件),未保存文件则需要让用户重新指定一个路径保存。

- 啥时候保存(实现)

我当时写的这里的时候是花了不少时间,比不得一晚上就搞完的大神,简直就是……..(此处省略。。。字),主要自己写的项目少的可怜,逻辑能力还得好好练练,又懒,加上有其他的事要做,,于是乎。。。

正题哈:

通过上面的逻辑分析,其实我们可以得知在执行这些功能时,无一例外的都需要判断,根据判断的结果再去执行它们原本所对应的功能,所以我使用方法重载(当然也有其他办法,可以提出来参考参考下~),把那些判断都写成了方法,根据不同的事件传参去执行方法。

- 编辑菜单

这里倒还好咯,算是一个小细节吧

程序一开始运行时,对文本的操作除了粘贴的enable属性为true,其他的enable属性为false;这里就要检查文本是否被检查(由于每次截图,子菜单截不下来所以就不放图了)

- 编辑菜单 — 查找功能

这里得专门添加一个窗体完成这事,原因想必也不用提了,查找主要分为向上查找和向下查找,辅助的选项就是查找的内容是否区分大小写

先说向下查找吧,这个明白了,向上查找也就差不多了;

向下查找:根据用户输入的内容在文本中查找,找到之后选中被查找到位置文本,换句话说也就是找指定字符在一大串字符串中的位置;没错,IndexOf就可以很好的实现这个功能;

但是查找并不是随便从一个位置开始查找,而是在鼠标光标停留处开始找,因此这个时候我们要做的有这几样工作:

1.获取到光标所在的位置,从当前位置向后开始查找;

2.获取文本内容及查找内容;

3.对查找结果进行判断,IndexOf方法如果未找到则返回 -1 ,反之返回查找内容在字符串中的位置;

4.如果找到了,则在被查找到的位置选中当前查找文本;

Keep going~

向上查找:反之,查找的位置是从当前光标往前查找,我也是做了这个功能对LastIndexOf有了进一步的理解; 再重复上述1-4步骤。

对了,还得判断用户选择往哪个方向找,放代码看看

C#Winform - 记事本简述

其中有点提一句,如果第一次查找找到了,下一次再查找坐标是否就要更新了呢?

我在程序注释里写的很清楚,具体就自己好好理解,是不是这个理~

- 查看 - 打开记录

该功能是记录用户打开了哪些文本,点击打开记录能够一目了然的清楚哪些文本打开过了,然后能够点击显示的侧边栏的文件名,下方也就显示对应的文本内容。

里面我是做了去重判断的,不会出现重复打开同一文件,而添加多个同一文件名。

- toolStripStatusLabel行与列的变动

这里我是上网查了行与列的变动是怎样实现的,总结以下几个用到的属性(emmmmm,之前毫不知情,抬头仰望45°天空的我…)

/*通俗点翻译就是:根据字符位置检索行号*/
richTextBox1.GetLineFromCharIndex(int index);
/*获取或设置文本框的起始点*/
richTextBox1.SelectionStart;
/*通俗翻译:检索给定的行号第一个字符的索引*/
richTextBox1.GetFirstCharIndexFromLine(int lineNumber);
           

行:根据给定字符位置检索行号(字符位置);

列:根据给定行号的第一个字符索引(获取到的行号(字符位置));

也算变相的给了代码啦,揣摩揣摩吧~

OK,基本上菜单里涉及到较思考的地方摆在这了,有错误或不妥之处,欢迎指出,互相交流!想看源码或者源码里面的注释可以戳下方链接:

源代码下载处

Ps:Winform程序打包会尽快写篇博客出来,这里我可碰了不少坑,o(╥﹏╥)o