【题目40】简易文本编辑器。

设计一个简易的文本编辑器。

设计要求:

(1) 具有图形菜单界面;

(2) 查找,替换(等长,不等长),插入(插串,文本块的插入)、文本块移动(行块,列块移动),删除;

(3) 可正确存盘、取盘;

(4) 正确显示总行数。

这是题目.................. 使用基于对话框的MFC   我想到的感觉有问题的点! 查找替换 算法不了解  最烦人的时文本块移动 百度好多业找不到!

文本块移动使用RICHEDIT控件 这个是自带文本块移动   存取盘问题可以读写文件(这里可能会遇到编码问题中文乱码!!!)代码我会附加的 链接 https://www.lanzous.com/i1u3ojc    (VS2013编译通过)        github不会用原谅我

截图

先说说那个richedit 需要初始化 不清楚的话取百度一下用法 否者会没法运行(闪退)  在你的InitInstance()下  添加 AfxInitRichEdit2();//初始化编辑框

然后是那个查找替换   需要注册消息应该是这样的C+MFC就学了一点这还没学

在你的DLG.CPP头文件中添加 (为什么别的(不是dlg.cpp)文件没发调用我就不知道了)
曾经出现这个事了
static const UINT MsgFindReplace = ::RegisterWindowMessage(FINDMSGSTRING); 这一段缺那个补那个 BEGIN_MESSAGE_MAP(CJIANDANBIANJIQIDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_EN_UPDATE(IDC_RICHEDIT21, &CJIANDANBIANJIQIDlg::OnEnUpdateRichedit21)
ON_REGISTERED_MESSAGE(MsgFindReplace, OnFindReplace)
ON_COMMAND(ID_tihuanchazhao, &CJIANDANBIANJIQIDlg::Ontihuanchazhao)
ON_COMMAND(ID_dakai, &CJIANDANBIANJIQIDlg::Ondakai)
ON_COMMAND(ID_lingcunwei, &CJIANDANBIANJIQIDlg::Onlingcunwei)
END_MESSAGE_MAP() 复写 OnFindReplace(WPARAM wParam, LPARAM lParam) 方法 下面是代码 网上好多不全百度很多不知道是那家 如果此人看到了此代码联系补引用链接
这个函数记得在头文件定义一下 long CJIANDANBIANJIQIDlg::OnFindReplace(WPARAM wParam, LPARAM lParam)
{
int curpos = 0;
int pos = 0;
if (pFindReplaceDlg->IsTerminating()){ //判断对话框是否被关闭
pFindReplaceDlg = NULL;
}
//获取当前查找对话框的指针
CString strText, repText; CFindReplaceDialog * pDlg = CFindReplaceDialog::GetNotifier(lParam);
strText = pDlg->GetFindString(); // 要查找的字符串
CString str; // RICHEDIT控件中的总的字符串m_RichEdit.GetWindowText(str);
bianjikuang1.GetWindowText(str); int len = strText.GetLength(); // 要查找的字符串长度
long index = 0, end_index = 0; // 索引的起始位置 及 结束位置, 从0开始if (find) // 查找对话框
if (pDlg->SearchDown())
{
bianjikuang1.GetSel(index, end_index);
index = str.Find(strText, end_index); // 从上次查询的结束位置处继续往下查询
if (index!=-1) //往下搜索时,找到所要查询的子字符串
{
bianjikuang1.SetSel(index, index + len); // 为找到的子字符串 设置选择标记
bianjikuang1.SetFocus(); // 在找到的子字符串上,设置焦点
}
else
{
index = str.Find(strText, 0); //从文件开始处,重新查找, 可以实现当搜索到文件末尾时,点查找下一个按钮时,可以从头重新查,从而实现循环功能
if (index == -1)
{
MessageBox(L"以查找完毕,无所查内容"); //若从开始处查找,仍然找不到,则说明无此查找内容
return 0;
}
bianjikuang1.SetSel(index, index + len); // 若从开始处查找,查询到所查内容,则为其做标记
bianjikuang1.SetFocus(); }}
else
{
bianjikuang1.GetSel(index, end_index); // 得到当前选择文本的始末位置
CString strReverse = str.MakeReverse(); // 对控件中的文字进行反转
CString strTextReverse = strText.MakeReverse(); // 对查找串的文字进行反转
index = strReverse.Find(strTextReverse, str.GetLength() - index); ////从反串中往下查找 查找的起点位置索引为 ID=STR.Length-index-1的前一位,即从源串开始位置的前一位搜索 ,不能从源串开始位置处搜索,因为若仅单个字符时,总是查询到这个位置,不会再往前查询了
if (index != -1)
{
end_index = str.GetLength() - index - 1; // 源串与反串index 的关
}
else
{
index = strReverse.Find(strTextReverse, 0);
if (index == -1){
MessageBox(L"以查找完毕,无所查内容");
}
bianjikuang1.SetSel(index, index + len);
bianjikuang1.SetFocus();
} }
if (pDlg->ReplaceCurrent())//替换
{
if (index == -1)
{
MessageBox(L"以查找完毕,无所查内容");
}
else
{
bianjikuang1.GetSel(index, end_index);
CString sub_left, sub_mid,
sub_ringht; sub_left = str.Left(index);
sub_mid = str.Mid(index, end_index - index);
if (sub_mid != strText) // 判断当前选择文本 是否为查找文本
{
MessageBox(L"请重新搜索");
return 0;
}
sub_ringht = str.Right(str.GetLength() - 1 - end_index + 1); // 右边串包含end_index这个位置的字符
repText = pDlg->GetReplaceString();
str = sub_left + repText + sub_ringht;
bianjikuang1.SetWindowText(str);
}
}
if (pDlg->ReplaceAll())
{
int num = 0;
CString mssag;
repText = pDlg->GetReplaceString();
len = repText.GetLength();
num = str.Replace(strText, repText);
bianjikuang1.SetWindowText(str);
mssag.Format(L"已经完成所有替换,共替换%d处", num);
MessageBox(mssag); } }

  接下来问题是打开保存文件遇到了 乱码问题 百度了不zhi一家

打开文件

	CFileDialog dlg(true, _T("txt"), _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("ALL Files(*.TXT)|*.TXT||"), NULL);
CString strPath, strText;
if (dlg.DoModal() == IDOK)
{
strPath = dlg.GetPathName();
//m_OP.SetWindowText(strPath);
CFile file(strPath, CFile::modeRead); TCHAR* temp = new TCHAR[file.GetLength() / 2 + 1]; file.Read(temp, file.GetLength());
temp[file.GetLength() / 2] = 0;
file.Close();
bianjikuang1.SetWindowTextW(temp);
}

  另存文件

CFileDialog dlg(FALSE);
CString strPath, strText;
char write[10000];
if (dlg.DoModal() == IDOK)
{
strPath = dlg.GetPathName();
if (strPath.Right(4) != ".TXT")
strPath += ".TXT";
//SetDlgItemText(IDC, strPath);
CFile file(strPath, CFile::modeCreate | CFile::modeWrite);
GetDlgItemText(IDC_RICHEDIT21, strText); CStringA strA(strText.GetBuffer(0));
strText.ReleaseBuffer();
std::string s = strA.GetBuffer(0);
const char* tempya = s.c_str(); strcpy_s(write, tempya);
WORD unicode = 0xFEFF; //这句重要,注意这里是F E FF,中间有个E
file.Write(&unicode, 2); //这句重要
file.Write(strText, wcslen(strText)*sizeof(wchar_t));
file.Close();
}

  代码链接已经附上了!!!状态栏我就不说了   不懂的具体百度!

C++ mfc 简易文本编辑器 遇到的一些问题的更多相关文章

  1. 用VC++MFC做文本编辑器(单文档模式)

    用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlna ...

  2. javascript 简易文本编辑器

    转载请注明出处:http://www.cnblogs.com/enzozo/p/4357031.html 写在前面: 本文本编辑器具备功能:选择字体大小.颜色.加粗.斜体.下划线.点击 'Submit ...

  3. Java实现"命令式"简易文本编辑器原型

    源自早先想法, 打算从界面方向做些尝试. 找到个简单文本编辑器的实现: Simple Text Editor - Java Tutorials. 原本的菜单/按钮界面如下. 包括基本功能: 新建/打开 ...

  4. AUTOGUI生成的一个简易文本编辑器

    ; Generated by AutoGUI #SingleInstance Force #NoEnv SetWorkingDir %A_ScriptDir% SetBatchLines - #Inc ...

  5. java文本编辑器5

    package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.* ...

  6. 简易富文本编辑器bootstrap-wysiwyg源码注释

    好久没写随笔了,因为最近比较忙,小公司基本都是一个前端干所有属于和部分不属于前端的事情,所以就没空弄了,即使想分享,也因为没有时间和精力就搁置了. 这周周六日休息,正好时间比较充裕(ps:目前处在单休 ...

  7. Java实现简易的文本编辑器

    需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊 ...

  8. 富文本编辑器Simditor的简易使用

    最近打算自己做一个博客系统,并不打算使用帝国cms或者wordpress之类的做后台管理!自己处于学习阶段也就想把从前台到后台一起谢了.好了,废话不多说了,先来看看富文本编辑器SimDitor,这里是 ...

  9. 【前端】wangEditor(富文本编辑器) 简易使用示例

    转载请说明作者或者注明出处,谢谢 说到前端常用的编辑器,自然也少不了富文本编辑器(RichText Editor) 笔者在此之前也看了一些相关的在线编辑器,其中包括了当百度搜索“富文本编辑器”字样时出 ...

随机推荐

  1. spring mvc注解之@RequestBody和@RequestParm

    @RequestBody http://localhost:8080/user/login { "username":"jack", "passwar ...

  2. 2019暑期集训第二讲 - 组合数学&概率&数学期望

    A - 容斥原理(CodeForces - 451E) 二进制状态压缩暴力枚举哪几个花选的个数超过了总个数,卢卡斯定理求组合数,容斥原理求答案 可以先把每个花的数量当成无限个,这样就是一个多重集的组合 ...

  3. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)E(多重集维护)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long ans[1000007]; ...

  4. 关于Android file.createNewFile() 方法出现的问题总结(转)

    原文:http://blog.csdn.net/wjdarwin/article/details/7108606 今天在编写向SDcard中,创建文件夹并向其中保存文件的过程中出现个一系列的问题 在此 ...

  5. Linux centosVMware LNMP架构介绍、MySQL安装、PHP安装、Nginx介绍

    一. LNMP架构介绍 和LAMP不同的是,提供web服务的是Nginx 并且php是作为一个独立服务存在的,这个服务叫做php-fpm Nginx直接处理静态请求,动态请求会转发给php-fpm   ...

  6. Python 爬取 北京市政府首都之窗信件列表-[后续补充]

    日期:2020.01.23 博客期:131 星期四 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] //博客总体说明 1.准备工作 2.爬取工作(本期博客) 3.数据处理 ...

  7. 网易云信-新增自定义消息(iOS版)

    https://www.jianshu.com/p/2bfb1c4e9f21 前言 公司业务需要,PC端,移动端都用到了第三方 网易云信 IM来实现在线客服咨询.在这当中难免遇到一些需求是网易云信没有 ...

  8. 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局

    文章概要: 1.简介下,tableView中的内容如何高度自适应的布局 2.如何做到让tableView的高度动态调整 还是看图作文吧- 首先,tableView的高度就是用户能够看见里面更大世界的那 ...

  9. Restful API及接口安全

    一.简介 REST(Representational State Transfer,具体状态转移),是一种基于HTTP协议.URI(统一资源定位符).JSON和XML这些现有协议与标准的,针对网络应用 ...

  10. 彻底搞懂 JS 中 this 机制

    彻底搞懂 JS 中 this 机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 目录 this 是什么 this 的四种绑定规 ...