用C++实现简易的文本编辑器[通俗易懂]

用C++实现简易的文本编辑器[通俗易懂]终于开始准备写自己的第一篇博客了,想想现在大二结束了,也要开始准备整理这么久学习的知识。学长们都对我说写博客是对自己知识整理最好的方法,所以我就静下心来把自己的课设写成自己的第一篇博客吧。废话就不多说了,接下来我来介绍一下我对实现这个简易的文本编辑器自己的理解。我自己的基本框架是.net,新建一个CLR项目,添加一个窗体。首先说一下要实现的基本功能,最基本的肯定是读写.txt文件,其次是复制、粘

大家好,又见面了,我是你们的朋友全栈君。

终于开始准备写自己的第一篇博客了,想想现在大二结束了,也要开始准备整理这么久学习的知识。学长们都对我说写博客是对自己知识整理最好的方法,所以我就静下心来把自己的课设写成自己的第一篇博客吧。

废话就不多说了,接下来我来介绍一下我对实现这个简易的文本编辑器自己的理解。
这是主窗体的样式很仿照windows的notepad

我自己的基本框架是.net,新建一个CLR项目,添加一个窗体。

首先说一下要实现的基本功能,最基本的肯定是读写.txt文件,其次是复制、粘贴、剪切、查找、替换,还有就是修改字体

由于要进行基本的操作,所以就要添加menustrip控件,自己编写菜单栏的各种功能。

前面也提到过要有读写文件,.net也提供了很便捷的控件——OpenFileDialog和SaveFileDialog可以通过短短几行的代码就达到读写文件的目的。


而中间的文本编辑我也使用了一个成为RichTextBox的控件

作为一个集合支持嵌入的对象,他很好的实现了很多我们所需要的普通的文本编辑功能,包括复制、粘贴、剪切、字体的类型等等,想做具体了解的可以去这里看看关于RichTextBox具体的方法RichTextBox Class


剩下就介绍一下我总体的思路

-首先是新建文件,一般来说新建文件的情况下是正在自己编辑文档,所以此时就要检查文本是否发生改变,所以我写了一个函数,每当新建文件,保存文件,打开文件的时候就调用textchanged函数,检查是否发生改变,如果改变就提示是否保存当前文本

private: void textchanged(String^ filepath)         //当text发生改变时调用此函数,询问是否保存.
{
             System::Windows::Forms::DialogResult re = MessageBox::Show("文件 " + filepath + " 的文字已改变\r\n想要保存文件吗?", "notepad",
                 MessageBoxButtons::YesNoCancel, MessageBoxIcon::Warning);      //用一个message传值来说明是否是否要进行保存
             switch (re)
             {

             case System::Windows::Forms::DialogResult::Yes:        //如果结果"是",要保存则将其保存为明码txt文件,名字可以自己定义
                 if (filename == "")
                 {
                     saveFileDialog1->FileName = "*.txt";
                     saveFileDialog1->Filter = "文本文档(*.txt)|*.txt";
                     saveFileDialog1->Title = "保存";

                     if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
                     {
                         richTextBox1->SaveFile(saveFileDialog1->FileName, RichTextBoxStreamType::PlainText);
                         this->Text = "无标题 - notepad";
                         richTextBox1->Clear();
                     }
                 }
                 else
                 {
                     richTextBox1->SaveFile(filename, RichTextBoxStreamType::PlainText);
                     this->Text = "无标题 - notepad";
                     richTextBox1->Clear();
                 }
                 break;
             case System::Windows::Forms::DialogResult::No:     //如果结果是"否",则不保存
                 richTextBox1->Text = "";
                 this->Text = "无标题-notepad";
                 break;
             default:
                 break;
             }
}

还有我想到的一点是打开和保存文件,因为原来C++有用流的方法实现过所以就进行了对文本的读写流的操作
代码如下:

private: void OpenFile()        //打开文件函数
{
            openFileDialog1->FileName = "*.txt";    //文件名
            openFileDialog1->Filter = "文本文档(*.txt)|*.txt|所有文件|*.*";     //格式过滤器
            if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)  //如果打开文件成功
            {
                StreamReader^ sr = gcnew StreamReader(openFileDialog1->FileName,Encoding::Default);     //用读入流指针读写个文件名
                this->Text = Path::GetFileName(openFileDialog1->FileName) + " - notepad";

                richTextBox1->Text = sr->ReadToEnd();       //将文件从流中读到最后写入richtextbox中
                filename = openFileDialog1->FileName;       //并将文件名赋值
                sr->Close();
            }

}

private: System::Void 保存SToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
             if (filename == "")
             {
                 saveFileDialog1->FileName = "*.txt";
                 saveFileDialog1->Filter = "文本文档(*.txt)|*.txt";
                 saveFileDialog1->Title = "保存";

                 if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
                 {
                     richTextBox1->SaveFile(saveFileDialog1->FileName, RichTextBoxStreamType::PlainText);   //写入文本,尝试过使用Stream Write回车会变成黑点.
                     richTextBox1->Modified = false;        //保存完文件之后标识为未更改
                     filename = saveFileDialog1->FileName;
                     this->Text = Path::GetFileName(saveFileDialog1->FileName) + " - notepad";
                 }
             }
             else
             {
                 richTextBox1->SaveFile(filename, RichTextBoxStreamType::PlainText);
                 // StreamWriter sw = new StreamWriter(filename, false, Encoding.Default); //上面交代过用写入流写会出现问题,所以用savefile
                 //sw.Write(richTxt.Text);
                 //sw.Close();
                 richTextBox1->Modified = false;        //保存完之后标识为未更改
             }
}

这里提一句,RichTextBox是自己提供了OpenFile和SaveFile的方法的,所以用读写流并不是唯一的方法,方法有很多种,鄙人不才,知道的方法也不多


再者就是关于查找替换的方法了

这里仅贴出关于查找的实现方法,其实替换就是将查找到的字符串进行另外赋值,所以不进行细讲

查找窗体的样式

private: System::Void button_next_Click(System::Object^  sender, System::EventArgs^  e) {
             if (radio_down->Checked)   //向下查找,用find方法查找,然后用select选中查找字段
             {

                 start = richTxt->Text->IndexOf(textBox_find->Text, start, richTxt->Text->Length - start, StringComparison::CurrentCultureIgnoreCase);

                 if (start != -1)
                 {
                     richTxt->Select(start, textBox_find->Text->Length);
                     start += textBox_find->Text->Length;
                     richTxt->Focus();
                 }
                 else
                 {
                     MessageBox::Show("已到文件末尾");
                     start = 0;
                 }

             }
             else       //向上查找
             {
                 start = richTxt->Find(textBox_find->Text, 0, start, RichTextBoxFinds::Reverse);    

                 if (start != -1)
                 {
                     richTxt->Select(start, textBox_find->Text->Length);
                     richTxt->Focus();
                 }
                 else
                 {
                     MessageBox::Show("已到文件末尾");
                 }
             }
             flag = true;
}

最后再讲讲为什么我不用C#来写winform

确实C#在.NET的方面比C++要便捷很多,没有那么多的域解析符,不用引入这么多头文件,但是可能是因为比较喜欢C++吧,有着高速的运行效率和指针的简便大概就是我对C++的执着。

最后提供一下我自己的写的这个程序的源码,是visual studio 2013编写。
用C++实现简易的文本编辑器

也谢谢各位看官赏眼看我的第一篇博客。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133138.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm 中文输入_pycharm中文输入法

    pycharm 中文输入_pycharm中文输入法1.Pycharm编译器中英文切换1.左上角打开file(文件)—>setting(设置)—plugins(插件)2.搜索chinese,点击安装3.安装完根据提示重启就行2.pycharm输入法不能输入中文1.找到pycharm的bin文件(我的是在/opt/pycharm/bin)2.打开pycharm.sh,在当前区域添加以下代码(我的是第144行)。如果是fcitx输入框架,则ibus换成fcitxexportLC_ALL=zh_CN.UTF-8expor

    2022年8月25日
    7
  • pip怎么卸载安装包_pip离线安装whl

    pip怎么卸载安装包_pip离线安装whl安装包1.在线安装:使用pipinstall+包名默认安装最新版本的包:格式:pipinstall+包名如在完成Python的安装后,我们需要安装pandas这个包,则只需要在终端中输入pipinstallpandas,在网络畅通的条件下,就会开始包的安装。安装指定版本的包:格式:pipinstall+包名==版本号在安装包的时候,默认是安装…

    2022年10月17日
    4
  • java校验json格式_json格式校验

    java校验json格式_json格式校验C语言json格式校验最近用到json格式数据传输信息,在C语言中使用cjson解析json字符串,若json格式不正确,会使整个进程直接挂掉。想到能否在解析前先进行格式校验,通过后再解析,查找资料,网上有现成源码,网址:http://www.json.org/JSON_checker/主要用到两个文件JSON_checker.c和JSON_checker.h,具体用法可以参考main.c。这里参考了博客:C语言如何检测json格式的数据合法性中的用法,并加以改进。在官网中提供了json检查的测试文

    2025年8月1日
    3
  • mysql 联合索引 唯一_mysql 联合索引和唯一索引

    mysql 联合索引 唯一_mysql 联合索引和唯一索引一般来说.如果有wherea=?andb=?andc=?的语句.如果表也有DML,我一般只在a上建索引.这也是代价平衡的结果.一方面只在a上建索引那么是indexrangescan,不像联合索引那样可以indexuniquescan,我觉得速度差的不多(数据量不大的情况).另一方面,DML也会更新index,更新三个column肯定比更新一个column慢…

    2022年6月1日
    40
  • Haystack的安装与使用

    Haystack的安装与使用1 什么是 HaystackHays 是 django 的开源全文搜索框架 全文检索不同于特定字段的模糊查询 使用全文检索的效率更高 该框架支持 Solr Elasticsearc Whoosh Xapian 搜索引擎它是一个可插拔的后端 很像 Django 的数据库层 所以几乎你所有写的代码都可以在不同搜索引擎之间便捷切换全文检索不同于特定字段的模糊查询 使用全文检索的效率更高 并且

    2025年12月15日
    5
  • TensorFlow|基于深度学习的人脸表情识别系统

    更新(2019-4-12)上传了模型权重和模型结构,因GItHub不支持25MB以上的文件,因此上传在此处,如果急用可以在此下载,也是作为对我工作的一些支持地址:https://download.csdn.net/download/shillyshally/11110754如果不急用可以在下方留下邮箱,我在看博客的时候会回复,但会有一段时间的延迟更新(2019-1-1)增加了r…

    2022年4月6日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号