文本编辑器
时间:2022-05-03
本文章向大家介绍文本编辑器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文本编辑器——记事本类型的应用,可以打开、编辑、保存文本文档。可以增加单词高亮和其它的一些特性。
效果图:
//CGEditorDlg成员
public:
CString m_filename;//打开文件名
CRichEditCtrl m_richedit;//富文本框控件
CString m_text;//富文本框中的文本
std::set<std::wstring> blueText;//需要变蓝色的单词
std::set<std::wstring> redText;//需要变红色的单词
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
afx_msg void OnBnClickedButtonsearch();//浏览按钮消息处理
afx_msg void OnEnChangeRichedit();//富文本框文本变化时消息处理
afx_msg void OnBnClickedButtonsave();//保存按钮消息处理
afx_msg void OnEnMsgfilterRichedit(NMHDR *pNMHDR, LRESULT *pResult);//筛选键盘消息,处理tab键
BOOL CGEditorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
m_richedit.SetEventMask(m_richedit.GetEventMask() | ENM_CHANGE | ENM_KEYEVENTS);
blueText.clear();
blueText.insert(L"int");
blueText.insert(L"double");
blueText.insert(L"float");
blueText.insert(L"void");
blueText.insert(L"char");
redText.clear();
redText.insert(L"include");
redText.insert(L"using");
redText.insert(L"namespace");
redText.insert(L"return");
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CGEditorDlg::OnBnClickedButtonsearch()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE, TEXT("cpp"), TEXT("text"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
TEXT("C源文件(*.c)|*.c|C++源文件(*.cpp)|*.cpp|文本文件(*.txt)|*.txt||"));//open
if (IDOK == dlg.DoModal())
{
//MessageBox(dlg.GetPathName());
wifstream ifs(dlg.GetPathName().GetBuffer());
if (!ifs.is_open())
{
MessageBox(dlg.GetPathName(), TEXT("文件打开失败"));
}
ifs.imbue(std::locale("chs"));
istreambuf_iterator<wchar_t> beg(ifs), end;
wstring text(beg, end);
m_text = text.c_str();
m_text.Replace(TEXT("t"), TEXT(" "));
m_text.Replace(TEXT("n"), TEXT("rn"));
m_filename = dlg.GetPathName();
ifs.close();
UpdateData(FALSE);
OnEnChangeRichedit();
SetWindowText(dlg.GetPathName());
}
}
void CGEditorDlg::OnEnChangeRichedit()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
long start, end;
m_richedit.GetSel(start, end);//保存光标位置
CHARFORMAT2 fm1, fm2;
memset(&fm1, 0, sizeof(fm1));
memset(&fm2, 0, sizeof(fm2));
//CPoint pos = m_richedit.GetCaretPos();
m_richedit.GetDefaultCharFormat(fm1);
m_richedit.GetDefaultCharFormat(fm2);
m_richedit.SetSel(0, -1);
m_richedit.SetSelectionCharFormat(fm2);
fm1.cbSize = sizeof(fm1);
fm1.dwMask = CFM_COLOR;
fm1.dwEffects &= ~CFE_AUTOCOLOR;
setlocale(LC_ALL, "chs");
m_text.Replace(TEXT("rn"), TEXT("n"));
wstring word;
wstring text(m_text.GetBuffer());
wstring::size_type index1 = 0;
wstring::size_type index2 = -1;
while ((index1 = text.find_first_of(L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", index1)) != wstring::npos)
{
index2 = text.find_first_not_of(L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", index1);
word = text.substr(index1, index2-index1);//切分出每个单词
if (blueText.find(word) != blueText.end())
{
fm1.crTextColor = RGB(0, 0, 255);
m_richedit.SetSel(index1,index2);
m_richedit.SetSelectionCharFormat(fm1);
}
else if (redText.find(word) != redText.end())
{
fm1.crTextColor = RGB(255, 0, 0);
m_richedit.SetSel(index1, index2);
m_richedit.SetSelectionCharFormat(fm1);
}
if (index2 == wstring::npos)
break;
else
index1 = index2 + 1;
}
//处理一下注释,因为这是后来加上去的,所以在这里处理,整体效率又被拖低了
index1 = index2 = 0;
while ((index1 = text.find(wstring(L"//"), index1)) != wstring::npos)
{
index2 = text.find_first_of(L"n", index1);
fm1.crTextColor = RGB(0, 255, 0);
m_richedit.SetSel(index1, index2);
m_richedit.SetSelectionCharFormat(fm1);
if (index2 == wstring::npos)
break;
else
index1 = index2;
}
m_richedit.SetSel(start, end);
//m_richedit.SetCaretPos(pos);
//m_richedit.SetSelectionCharFormat(fm2);//???
}
void CGEditorDlg::OnBnClickedButtonsave()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (IDOK == MessageBox(TEXT("确定保存?"), TEXT("保存")))
{
ofstream ofs(m_filename.GetBuffer(),ios::trunc);
if (!ofs.is_open())
{
MessageBox(TEXT("文件保存失败!"));
ofs.close();
return;
}
m_text.Replace(TEXT("rn"),TEXT("n"));
m_text.Replace(TEXT(" "), TEXT("t"));
setlocale(LC_ALL, "chs");
ofs.write(CStringA(m_text).GetBuffer(), wcstombs(NULL,m_text.GetBuffer(),NULL));
ofs.close();
}
}
void CGEditorDlg::OnEnMsgfilterRichedit(NMHDR *pNMHDR, LRESULT *pResult)
{
MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);
// TODO: 控件将不发送此通知,除非您重写
// CDialogEx::OnInitDialog() 函数,以将 EM_SETEVENTMASK 消息发送
// 到该控件,同时将 ENM_KEYEVENTS 或 ENM_MOUSEEVENTS 标志
//“或”运算到 lParam 掩码中。
// TODO: 在此添加控件通知处理程序代码
if (pMsgFilter->msg == WM_KEYDOWN && pMsgFilter->wParam == VK_TAB)
{
UpdateData(TRUE);
long start, end;
m_richedit.GetSel(start, end);
//CPoint pos = m_richedit.GetCaretPos();
m_text += TEXT(" ");
UpdateData(FALSE);//原来这里会改变光标的位置!!!
//m_richedit.SetCaretPos(pos);
m_richedit.SetSel(start+4, end+4);
OnEnChangeRichedit();
*pResult = 1;
}
else
*pResult = 0;
}
- linux学习第六十二篇:添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理
- Entity Framework Core 2.0 入门
- Nodejs开发框架Express3.0开发手记–从零开始
- 使用 nvm 管理不同版本的 node 与 npm
- svg矢量图绘制以及转换为Android可用的VectorDrawable资源
- CListCtrl控件使用方法总结
- JavaScript基础考核真题——你能全做对吗?
- 拉手网面试题,不一样的难度
- Html 5 video/audio 格式转换 ogg
- ASP.NET MVC 开源项目Kigg解读(1)
- 一个setInterval的小问题
- scrollLeft等属性介绍
- ASP.NET MVC 开源项目Kigg解读(2)——Kigg.Core第一部分
- JavaScript 实现接口 (Interfaces In JavaScript)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- s6中class的一些基础知识和es5语法的对比
- 在CentOS 8上使用Elastic Stack: Elasticsearch/Kibana 7.8的部署与认证配置
- 做一个简单的京东购物栏
- 解决Elasticsearch SQL命令行启动报错 ./x-pack-env: No such file or directory
- MySql 入门到精通-sql查询语句的执行过程,你真的知道吗?
- 用 float 存储金额,老板说损失从工资里扣!
- 分布式追踪实战
- python的接班者之coconut
- Docker 垃圾回收机制补充
- 通过docker image 获取到 dockerfile
- Tensorflow2.0实现简单的RNN文本分析
- 利用Tensorflow2.0实现手写数字识别
- PyTorch,TensorFlow和NumPy中Stack Vs Concat | PyTorch系列(二十四)
- 为什么大家都说“SELECT *”效率低?
- 手把手教你如何搭建一套GPS定位系统平台