【文本】简易文本编辑器分析

编写工具:MFC 

一、功能分析

         A、文件:新建、打开、保存、另存为         B、编辑:撤销、删除、剪切、复制、粘贴、全选

        C、应用:查找/替换、字体设置、统计字符串、统计字数

        D、关于EasyTXT、帮助                                 E、关联注册、还原注册

        具体分析:

        A1 “新建”消息响应

                m_Edit.GetModify()来获取,Edit框是否被修改过,如果返回值为TRUE,则提示是否保存,调用“保存”,否则,

          A2 “打开”消息响应

               打开方式1:首先对文件路径进行一个分析,char read[50000];file.Read(read,50000)中,然后用for(file.length)将read[5000]数据,复制到CString strText中, 用strText+=read[i]方式。

file.Close();
m_Edit.SetWindowText(strText);
m_Edit.SetModify(FALSE);
isNew = FALSE;
Invalidate()

        A3 “保存”消息响应    

     if(isNew)  调用另存为函数,//第一次新建且未保存
      else
     m_Edit.GetWindowText(strText);
     strcpy(write,strText)//char write[50000],CString strText
     file.Write(write,strText.GetLength());
     m_Edit.SetSel(0,0);//什么都不选择

          A4 另存为

    CFileDialog dlg;
    CFileStatus fs;
    dlg.DoModal();//提示保存文件对话框
     strPath = dlg.GetPathName();//获取路径名
     strPath.Right(4) !=".txt"  strPath+=".txt";//不是.txt结尾,则加上.txt
    if(CFile::GetStatus(strPath,fs))//获取文件,返回了,则已存在
    //存在则提示,是否替换,是,则替换,不是,则调用另存为,
   //不存在,则直接写入strPath路径,
    isNew = FALSE;//不是新的文件
    m_Edit.SetModify(FALSE);//标记为未修改

         A5 退出

    isModified = m_Edit.GetModify();//

    if(isNew && string.IsEmpty())//若是新建文件,且有内容,则CDialog::OnClose(),直接退出

    if(isModified)//如果被修改过,则提示是否保存,否则直接退出

       B、编辑:撤销、删除、剪切、复制、粘贴、全选

    m_Edit.Undo();//“撤销”菜单响应
     m_Edit.Clear();//“删除”菜单响应,可见是对选中部分进行删除
     m_Edit.Cut();//剪切选中的部分
    m_Edit.Copy();//复制选中部分
    m_Edit.Paste();//粘贴
    m_Edit.SetSel(0,-1);//全选     

     C、应用:查找/替换、字体设置、统计字符串、统计字数

//C1  查找/替换
   dlg = new CFindReplaceDialog;//查找对话框
   dlg->Create(FALSE,NULL);
   dlg->ShowWindow(SW_SHOW);//显示它
   CEasyTXTDlg::OnFindReplace(wParam,lParam);//这个是
   strText = dlg->GetFindString();//获取要查找的字符串
   m_Edit.GetWindowText(str);//获取Edit字符串到CString str中;
   if(dlg->ReplaceAll())//判断是否替换所有,
   strText = dlg->GetFindString()//获得要替换的字符
   repText = dlg->GetReplaceString()//获得替换后的字符
   str.Replace(strText,repText);//替换
   m_Edit.SetWindowText(str);//显示到Edit中去
   if(dlg->ReplaceCurrent());//是替换,还是查找
   find = FALSE;else find = TRUE;//根据find标志,去替换或者查找,基本思路一致
//C2 字体设置
   TempFont = m_Edit.GetFont();//获取当前字体
   TempFont->GetLogFont(&LogFont);//LOGFONT类型,
   CFontDialog dlg(&LogFont);//初始字体对话框
   m_Font.Detach();
   dlg.GetCurrentFont(&temp);//LOGFONT temp;
   m_Font.CreateFontIndirect(&temp);//直接创建字体
   m_Edit.SetFont(&m_Font);//设置字体
//C3 统计字符串
   CCountStringDlg dlg;
   dlg.SetText(str);//m_Edit.GetWindowText(str);
   dlg.DoModal();
//统计字数
   char c = strText.GetAt(i);//i从0,到strText.GetLength()
   c<0 || c>255 //表示非英文字符
   if(c == '\r') i++;nEnterLength++;\\跳过一个,因为Enter占2个字符,Enter计数量+1
   else nEnLenth++;if(c==' ')//为空格,
   if(c>'0' && c<='9') //数字
   if(c>='a' && c <='z' || (c>'A' && c<='Z')//字母
   nCLength=(Length-nEnLenth)/2-nEnterLenth;//中文字符个数,总字符-英文字符-Enter个数*2,再除以2
   CCountAllDlg dlg;
   dlg.SetText(各个统计的参数);
   

         D、关于EasyTXT、帮助  

       	CHelpDlg dlg; dlg.DoModal();//弹出关于对话框
	m_HelpText.SetWindowText(str);//OnInitDialog()中初始化帮助对话框中的数据,str是局部变量,并且赋值,m_HelpText是不可修改内容的Edit框

         E、关联注册、还原注册        

//关联注册
str1 = "用EasyTXT miniword打开";//关联右键
str2 = GetModuleHandle(NULL)//程序路径
str3 = "str2"//代码表示为:str3 = "\""+str2+"\"";
str2 +=""%1\""//将引号加入的方法是\"
value = RegCreateKeyEx(&hresult,)//txtfile\\shell\\open   open键写入
value = RegSetValueEx(hresult,) //设置open键的项目值
value = RegCreateKeyEx()//txtfile\\shell\\OPEN\\command   双击键写入注册表
value = RegSetValueEx(hresult,)//设置项及项值
value = RegCreateKeyEx()//txtfile\\DefaultIcon 图标写入
value = RegSetValueEx(hresult,)//设置项及项值
::RegCloseKey(hresult);
//还原注册

         
            依照上面的还原即可,最后提示,

               

          菜单栏: 

          EasyTXT_ToolBar.SetButtonInfo(0,ID_MENU_NEW,TBSTYLE_BUTTON,0);//

          SetButtonText(0,"新建文件");

          SetButtonInfo(1,ID_MENU_SAVE,TBSTYLE,..1,)//

          SetButtonText(1,"保存文件");

          菜单的图标:

           EasyTXT_ToolBar.CreateEx(this)//

           CImageList ImageList;

            ImageList.Create(32,32,ILC_COLOR32 | ILC_MASK,10,10);//创建图像列表

            ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));//分别加载图片

            EasyTXT_ToolBar.GetToolBarCtrl().SetImageList(&ImageList);//设置图像

           ImageList.Detach();释放图像列表

           EasyTXT_ToolBar.SetButtons(NULL,9)//这只工具栏按钮


 

        总结:1、m_Edit.GetWindowText(CString类),CString类中一定是根据文本的长度,来计算空间大小,然后在进程的空间分配一定大小的内存,即程序可访问,把数据拷贝到CString str中。SetWindowText是传一个指针给内部,然后内部可能会把数据写到一个缓冲内存,Edit内部只需保存一个这个缓冲内存字符数据的地址。

、交互分析

        主界面如下:

       

      1、数据分析  

            每当打开时,先把数据读进内存,然后再进行操作。编辑,则调用m_Edit默认函数;统计和查找、替换,都是GetWindowText到一个内存缓冲区,然后进行,在局部显示时。

            对话框类的交互方式:a、用局部dlg,必要时,给它传参数,再调用dlg.DoModal()   b、在所属类中,声明对象dlg,然后用dlg获取必要的数据。

            工具栏加载图标时,用ImageList读取每个图标,SetImageList(),ImageList.Detach();//可能图标数据会送到TooBar类的里面,由它来管理,这时可释放ImageList资源。

参考:1、C++程序设计报告

2、Delphi高仿记事本源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值