用C++实现简易的文本编辑器
2016-07-04 17:27
751 查看
终于开始准备写自己的第一篇博客了,想想现在大二结束了,也要开始准备整理这么久学习的知识。学长们都对我说写博客是对自己知识整理最好的方法,所以我就静下心来把自己的课设写成自己的第一篇博客吧。
废话就不多说了,接下来我来介绍一下我对实现这个简易的文本编辑器自己的理解。
我自己的基本框架是.net,新建一个CLR项目,添加一个窗体。
首先说一下要实现的基本功能,最基本的肯定是读写.txt文件,其次是复制、粘贴、剪切、查找、替换,还有就是修改字体。
还有我想到的一点是打开和保存文件,因为原来C++有用流的方法实现过所以就进行了对文本的读写流的操作
代码如下:
这里提一句,RichTextBox是自己提供了OpenFile和SaveFile的方法的,所以用读写流并不是唯一的方法,方法有很多种,鄙人不才,知道的方法也不多
最后提供一下我自己的写的这个程序的源码,是visual studio 2013编写。
用C++实现简易的文本编辑器
也谢谢各位看官赏眼看我的第一篇博客。
废话就不多说了,接下来我来介绍一下我对实现这个简易的文本编辑器自己的理解。
我自己的基本框架是.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++实现简易的文本编辑器
也谢谢各位看官赏眼看我的第一篇博客。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
- c++ primer 第五版 笔记前言
- 如何在 Linux 中安装微软的 .NET Core SDK
- share_ptr的几个注意点
- C#.NET获取拨号连接的宽带连接方法
- C#.Net ArrayList的使用方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- PowerShell中使用.NET将程序集加入全局程序集缓存
- .net(c#)中的new关键字详细介绍
- 由vbs sort引发.NET Framework之间的关系说明
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- C++联合体转换成C#结构的实现方法
- .NET中的async和await关键字使用及Task异步调用实例
- 基于.NET平台常用的框架和开源程序整理
- C++高级程序员成长之路
- C++编写简单的打靶游戏