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();
	}

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

原文地址:https://www.cnblogs.com/xuexidememeda/p/9612918.html

时间: 2024-08-28 07:24:45

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

简易文本编辑器(Delphi源码)

计划一个简略单纯的文本编纂器,具有建立.编纂.生存平凡文本文件的功能. unit U nit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls; type  TForm1 = class(TForm)    Panel1: TPanel;    Memo1: TMemo;    OpenDialog1:

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

用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默

[汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)

汇编实现的一个简易的文本编辑器,代码中有详细的注释. 思路和细节: (1) 在屏幕中央初始化一片面积,并且定位光标,利用16号中断0号功能分别在ah,al中存储扫描码和ascii码,由此进行功能键的判断. (2) 实现对光标的操作,通过对dh,dl的变化和10号中断的2号功能进行光标的设置,上下左右分别改变dh,dl的值即可. (3)退格键的操作实现是 光标左移,然后利用21号中断输出空格即可实现删除操作. (4)下界超过某一个设定的值后就进行上卷一行的操作,此时当前光标位置随之上移. (5)注

MFC 记事本 文本编辑器

MFC 写的记事本,文本编辑器,需要的自己拿: tips : 博主用的 vs 2019 ,如果出现不能运行的情况多半是版本的问题,自己升级一下. 1 github 地址 :https://github.com/jiujue/MFC-NotePad.git 过程在github 上也有,要看的自己找吧.在资源目录下(res). 原文地址:https://www.cnblogs.com/jiujue/p/12416477.html

Java实现&quot;命令式&quot;简易文本编辑器原型

源自早先想法, 打算从界面方向做些尝试. 找到个简单文本编辑器的实现: Simple Text Editor - Java Tutorials. 原本的菜单/按钮界面如下. 包括基本功能: 新建/打开/保存文件, 文本编辑与剪切/复制/粘贴. 把所有菜单/按钮替换为命令输入后效果如下, 源码库在: program-in-chinese/simple-text-editor-in-Java. 与其他命令行工具一样, 省去界面元素的代价是输入较繁琐. 在文本和命令两处切换也有点麻烦. 接下去试着实现

java文本编辑器5

1 package peng_jun; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 import java.io.*; 9 10 import javax.swing.filechooser.*; 11 12 import java.awt.datatransfer.*; 13 14 public class Text4 extends JFrame { 15 public sta

java文本编辑器 版本4

1 package peng_jun; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 import java.io.*; 9 10 import javax.swing.filechooser.*; 11 12 import java.awt.datatransfer.*; 13 14 public class Text3 extends JFrame { 15 public sta

简易文本编译器

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <math.h>#define MAX_LEN 240#define NOT_FOUND -1//函数声明  void HeadWord(void);      //输出大标题,永远出现在程序的最顶端.  void PrintWord(void);    //输出文本的内容 void

Java实现简易的文本编辑器

需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊字符的个数,及总的字符个数 开发环境: windows7 + Eclipse luna + WindowsBuilder插件 代码实现: import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.ev