C/C++知识点之C++ mfc 简易文本编辑器 遇到的一些问题
小标 2019-01-21 来源 : 阅读 839 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C++ mfc 简易文本编辑器 遇到的一些问题,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C++ mfc 简易文本编辑器 遇到的一些问题,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C++ mfc 简易文本编辑器 遇到的一些问题

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

设计一个简易的文本编辑器。
设计要求:
(1) 具有图形菜单界面;
(2) 查找,替换(等长,不等长),插入(插串,文本块的插入)、文本块移动(行块,列块移动),删除;
(3) 可正确存盘、取盘;
(4) 正确显示总行数。
这是题目.................. 使用基于对话框的MFC   我想到的感觉有问题的点! 查找替换 算法不了解  最烦人的时文本块移动 百度好多业找不到!!呵呵难受的是在吾爱发个两个帖子求一下思路 被狗骂了那个人是真的神精符附上链接https://www.52pojie.cn/forum.php?mod=viewthread&tid=792411&page=1#pid21689077 大家了解一下吧(这种人现实中我要看看他脑壳硬还是我砖头硬,看了他一下评论他对C不了解,抠脚装大尾巴狼日常喷人,要不是老子吧帖子不允许评论能TMbb一年,真的够给他脸了)
文本块移动使用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/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程