C#编写记事本程序(下)——扩展功能

扩展记事本的功能
上次的文章只是给出了编写记事本的文件装载及保存的部分,但是对于一个记事本仅仅有基本的功能还是不能满足人们编辑文本的需要的,这里就接着上篇博文的内容,对记事本的大部分功能进行扩展。当然,大部分的解释都在代码的注释中,这里会说几个值得注意的地方的代码。同样文章结束会附上下载完整程序及源码的链接!
最终运行效果部分图
增加文本编辑功能

支持打印或者PDF

提供查找功能

设计一个About弹窗设计,可以自由发挥!
这里写图片描述

下面就结合代码对编写过程中应当注意的问题进行分析:
一、新增加的控件(主要指对话框)
FontDialog //字体对话框
ColorDialog //文本颜色对话框
PrintDocument //打印页面设置对话框
PrintPreviewDialog //打印预览对话框
PrintDialog //打印对话框
其余的就是一些标签、文本、按钮等,可自己添加设计。

二、文本编辑功能实现
这里主要设计右键的复制、粘贴、剪切等功能,也就是在上篇文章ContextMenuStrip菜单当中,这个地方很简单,因为richTextBox都含有相应的方法,我们只需要给其加鼠标的点击响应事件即可,如下:

        /// <summary>
        /// 记事本的文本编辑功能实现
        /// </summary>
        /// <param name="..."></param>
        /// <param name="..."></param>
        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            //打开内容菜单响应事件
        }

        private void toolStripMenuItem12_Click(object sender, EventArgs e)
        {
            //用丰富文本框的Cut方法实现剪切功能
            richTextBox1.Cut();
        }

        private void toolStripMenuItem13_Click(object sender, EventArgs e)
        {
            //用丰富文本框的Copy方法实现右键复制文本功能
            richTextBox1.Copy();
        }

        private void toolStripMenuItem14_Click(object sender, EventArgs e)
        {
            //用丰富文本框的Paste方法实现右键粘贴文本功能
            richTextBox1.Paste();
        }

        private void toolStripMenuItem11_Click(object sender, EventArgs e)
        {
            //用丰富文本框的Undo方法实现右键撤销文本功能
            richTextBox1.Undo();
        }

        private void toolStripMenuItem15_Click(object sender, EventArgs e)
        {
            //用丰富文本框的Redo方法实现右键恢复文本功能
            richTextBox1.Redo();
        }

三、实现查找与替换对话框
这个地方的主要思路就是,提取待查找的字符串在文本区中寻找,找到返回其位置,找不到弹出用户提示。至于替换,就是在查找到的情况下覆盖原来的字符串。相应的方法都集成在richtextbox中,十分方便,看代码就很明白。
唯一需要注意的地方是,新建一个Windows窗体,也就是查找和替换的那个小框,怎么和主窗体配合。解决的方法就是,新窗体的class中的构造函数需要传一个主窗体类型的对象,然后就可以把主窗体传到子窗体的执行函数里,便可以调用主窗体的相关方法。如下:
子窗体的构造函数加一个新的参数

传当前窗体this

就行上面两部分那样相互配合,然后再看源码中函数的调用关系就十分清晰了。

下面是查找与替换的代码,这真的没什么好说的,确实明白的用注释足以讲得清楚!

/// <summary>
        /// 如下两个方法将会被formFindReplace类代码调用
        /// </summary>
        /// <param name="findString/replaceString"></param>
        public void FindRichTextBoxString(string findString)
        {
            //查询语句代码实现
            if(findposition >= richTextBox1.Text.Length) 
            {
                //已经查找到文本底部,弹出用户提示
                MessageBox.Show("已到文本底部,再次查找将回到顶部", "提示", MessageBoxButtons.OK);
                findposition = 0;
                return;
            }
            /* 
             * 下面的代码进行查找并返回找到的位置,如果未找到则返回-1
             * 参数1是待找的字符串,参数2是查找的开始位置,参数3是查找的
             * 选项,如大小写是否匹配、查找方向等。
             */
            findposition = richTextBox1.Find(findString, findposition, 
                RichTextBoxFinds.MatchCase);
            if(-1 == findposition) 
            {
                //未找到,弹出用户提示
                MessageBox.Show("已到文本底部,再次查找将回到顶部", "提示", MessageBoxButtons.OK);
                findposition = 0;
            }
            else
            {
                //成功匹配到查找的字符串
                richTextBox1.Focus();                               //主窗体获得字符串焦点
                findposition += findString.Length;                  //更新查找位置到当前查找的到的字符串处
            }
        }
        public void ReplaceRichTextBoxString(string findString, string replaceString)
        {
            //替换字符串代码实现
            if(richTextBox1.SelectedText.Length != 0) 
            {
                //文本框内选中的子串存在,执行替换
                richTextBox1.SelectedText = replaceString;
            }
        }

这两个函数在子窗体class的鼠标点击事件里调用就可以实现查找与替换文本的功能。

四、字体与颜色
这是比较实用和有趣的功能模块,主要思路就是加对话框控件,之后再响应事件里展示Dialog即可,代码十分简洁!下面拿颜色举例:

  private void toolStripMenuItem19_Click(object sender, EventArgs e)
        {
            //修改颜色选项响应事件
            if(colorDialog1.ShowDialog() == DialogResult.OK) 
            {
                //颜色对话框弹出成功,修改选中文本的颜色
                richTextBox1.SelectionColor = colorDialog1.Color;
            }

        }

五、打印功能的实现
这部分相比其他功能算是最麻烦的一个,因为打印的过程需要处理的事情比较多,而且文本的打印还需要自己用代码实现,虽然稍微复杂一些,但是思路还是相当清晰的,打印过程可以把自己的眼睛想象成一个扫描装置,并且在一行一行、一页一页的在扫描纸张。
打印过程中的3个函数:
printDocument1_BeginPrint //打印前执行的函数
printDocument1_PrintPage //打印过程中执行的函数
printDocument1_EndPrint //打印完成后执行的函数
第一个函数主要是初始化打印的字体及文本等,第二个函数相对复杂一些,因为他需要一行行的扫描,并且判断文本在当前页中的位置,还得检查打没打印完,但是有了刚才我的那个比喻,这一切似乎明晰起来!最后一个函数是’善后’工作,对程序打印过程中所占用的资源进行回收、释放。

 private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            //打印过程中执行的函数
            float linesPerPage = 0;                                 //记录每页的最大行数
            float yPos = 0;                                         //记录将要打印的一行数据在垂直方向上的位置
            int cnt = 0;                                            //记录每页已经打印的行数
            float leftMargin = e.MarginBounds.Left;                 //左边距
            float topMargin = e.MarginBounds.Top;                   //上边距
            string line = null;                                     //读取的的每一行字符将存在line中
            //计算,linesPerPage = 一页纸打印区域的高度/一行字符的高度
            linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
            //如果当前页已打印行数小于每页最大行数而且读出数据不为null,继续打印
            while(cnt < linesPerPage && ((line = streamToPrint.ReadLine()) != null)) 
            {
                yPos = topMargin + (cnt * printFont.GetHeight(e.Graphics));
                //开始打印
                e.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, 
                    yPos, new StringFormat());
                cnt++;
            }
            //是否需要打印下一页
            if(line != null) 
            {
                e.HasMorePages = true;                              //需要打印下一页
            }
            else{
                e.HasMorePages = false;                             //不需要打印下一页
            }
        }

十分注意!在编写打印有个的代码的时候,必须加上相关的using来支持,没错!就是下面那两个:
using System.IO;
using System.Drawing.Printing;

六、聊一聊Windows窗体设计!
这个应用中有几个子窗体需要自己设计,C#的可视化编程和控件都使得这一起十分容易,可以让我们把经历放到真正的用户体验上,这十分伟大。大部分控件的属性都可以在属性面板内直接修改(选中相应的控件按F4即可弹出)。如下面这个窗体:
这里写图片描述

属性面板:
这里写图片描述
点中每一个属性,下面都会有相应的解释,这里设置了其开始出现的位置StartPosition为母窗体的中心Center Parent;去掉最大化、最小化权限;不允许修改大小等等,只要在此面板里的都可以修改来看看效果!
好了,其实用C#编写记事本还是十分方便的,你也可以为他添加更多的功能,也可以更熟练的使用C#语言来创作新的软件!
文章中的源代码及发布的安装程序下载链接:
链接:http://pan.baidu.com/s/1qYC4Tje 密码:fx1j
声明:图片等资源均来源于网络,仅供学习交流之用!

猜你喜欢

转载自blog.csdn.net/weixin_37818081/article/details/78587196