C++课程设计报告简易文本编辑器_第1页
C++课程设计报告简易文本编辑器_第2页
C++课程设计报告简易文本编辑器_第3页
C++课程设计报告简易文本编辑器_第4页
C++课程设计报告简易文本编辑器_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简易文本编辑器面向对象程序设计课程设计报告(2011/2012学年第二学期)题目名称 简单文本编辑器的设计系部 专 业计算机科学与技术学生完成时间 2012 年6月指导老师ii简易文本编辑器引言在文本编辑器出现前,人们用打孔机把计算机文字打到穿孔卡片上。文字存放于一 个装着这样的薄卡片的盒子里,可以用读卡器来阅读它。第一个文本编辑器是一种行编辑器, 它运行在打字机型的终端上,这种编辑器并不 具备在窗口和屏幕中显示的功能。它包含了一些非常短的命令(为了减少打字量)。其中一个命令能够把文件的指定部分通过打字机打印出来。编辑光标是想象中的一个插入点,通过特殊命令,可以把它移动到特定内容字符串所在的行

2、。随后,内容字符串又被 扩展成正则表达式。如果想看到文件的变化,你需要把它打印出来。相对于穿孔机来说, 人们认为这种基于行的文本编辑器具有革命性的进步。如果没有它,用户就需要把那些 处理文本的命令打成专用的卡片,并在编辑文件时使用这些卡片。当带有显示屏的计算机终端出现后,基于显示屏的文本编辑器开始流行起来。 最早的全屏编辑器中,有一种叫做 026它是于1967年为CDC 600(系列机器的操作控 制台而作的。另外一个早期的全屏编辑器是 vi o vi诞生于20世纪70年代,至今,它 仍是Unix和Linux的标准编辑器。全屏编辑器对视频终端的销售起到了促进的作用。文本编辑器在 Windows的

3、应用中是一个非常重要的项目,在过去十数年中,微软对 wi ndows文本编辑器有多个版本的升级改进,而基于其他的编程环境的文本编辑器也是 多如牛毛,今天我们用MFC可视化编译环境做一个简易的文本编辑器。5目录引言 21. 课程设计目的和意义 42. 详细设计 42.1需求描述 42.1.1 文件42.1.2 编辑42.1.3 应用52.1.4 帮助52.1.5 高级52.2功能描述 52.2.1 文本编辑区52.2.2 文件72.2.3 编辑152.2.4 应用162.2.5 帮助212.2.6 高级222.2.7 菜单栏252.2.7 图标262.3程序运行说明 273. 课程设计总结 30

4、3.1编程日志 303.3测试报告 314. 心得体会 315. 参考文献 311. 课程设计目的和意义面向对象程序设计课程设计是实践性教学环节之一,是面向对象程序设计课程的辅助教学课程。该课程设计要求学生综合运用在面向对象程序设计课程中学到的面向对象技术与实际编程相结合, 独立完成一项较为完整、并具有一定实际功能的 课程设计任务,同时加深学生对面向对象和 C+编程技术的理解和掌握,培养实际的应 用程序开发能力。在课程设计过程中,使学生养成良好的程序设计风格,并掌握C+应用程序的设计开发过程和编程方法、测试方法2. 详细设计2.1需求描述简单文本编辑器的设计是基于 Microsoft Visu

5、al Studio 2008开发的一款小型的软件,主要的设计是为了满足普通用户对文本文档进行一般的简单操作,通过MF可视化编程环境,直接生成一个友好的用户操作界面,通过这个窗口,用户可以对文本进行如下 的基本操作。2.1.1 文件 新建:创建一篇空白文档,从“工具栏”或“文件下拉菜单”中创建 打开:打开文本(.txt )文件,从“工具栏”或“文件下拉菜单”中打开;或将文本(.txt )文件拖入程序界面打开或应用程序图标上打开;或右键单击文本文件,在“打开方式”中选择本程序打开 保存:保存文档,从“工具栏”或“文件下拉菜单”中打开另存为:保存文件副本,在不同位置或以不同文件名保存文档, 从“工具

6、栏”或“文 件下拉菜单”中另存2.1.2 编辑撤销:撤销前一步所进行的操作,从“编辑下拉菜单”或“右键菜单”中撤销 删除:删除当前选定字符(串),从“编辑下拉菜单”或“右键菜单”中删除 剪切:复制并删除选定字符(串),从“编辑下拉菜单”或“右键菜单”中剪切 复制:复制选定字符(串),“编辑下拉菜单”或“右键菜单”中复制 粘贴:对粘贴内容进行粘贴,从“编辑下拉菜单”或“右键菜单”中粘贴 全选:对文本编辑框中文本全部选定,从“编辑下拉菜单”或“右键菜单”中全2.1.3 应用 查找/替换:输入查找内容(和替换内容),可从光标位置逐个查找(或替换)相应 内容,也可一次性全部替换掉相应内容,从“工具栏”

7、或“应用下拉菜单”中执行 字体设置:设置字体、字形及字的大小,从“工具栏”或“应用下拉菜单”中设置字体 统计字符串:统计用户输入的字符串出现次数,从“工具栏”或“应用下拉菜单”中执行 统计字数:统计所有字符数、中文字符数、英文字符数、数字字符数和空格数,从“工具栏”或“应用下拉菜单”中启动2.1.4 帮助 关于EasyTXT显示关于本程序的信息, 从“帮助下拉菜单”中启动 帮助:显示程序帮助文档,包括程序功能、使用、简要说明等各种信息,从“工具栏”或“帮助下拉菜单”中启动2.1.5 高级 关联注册:向注册表添加SLV文件关联,改变文本(.txt )文件图标,并使文本(.txt) 文件可单击右键

8、后选择用本程序打开(部分功能重启或注销后方能生效) 还原注册:取消注册,文本(.txt )文件还原为默认图标,不能右键打开(部分功能 重启或注销后方能生效)2.2功能描述2.2.1文本编辑区本程序的编译框架为MFC功能的实现使用的是模块化的编程方式进行,由于使用的是MF可视化编程,所以其中的很多过程使用的是相关的系统自带函数实现的,其中整 个编辑器的编辑区使用的是MF动生成的文本框,但是这个文本框没有插入符,不能 实现文字编辑功能,所以需要在程序的 CEasyTXTVieW中插入一些特定的文本编辑函数, 如插入符函数cwnd:createsolidcreat,这个函数默认的为隐藏,所以在后面需

9、要showcreate ()才能正常显示,而整个编辑器的操作编辑部分使用的是一个独立的 *.CPP 进行控制的,代码中使用的是图形至于文本输入的下方并设置为透明,在下面的文本编 辑区下层有一张写有内容的图片作为装饰,换行等动作惠济路插入符位置并按照坐标进 简易文本编辑器行绘制,文本框的大小改变等会导致文本编辑区的重绘,所以在改变文本框时必须调用 函数对文本框中的内容进行保存,相关代码如下所示:BOOL CBmpEdit:O nEraseBkg nd(CDC* pDC)CDC memDC;memDC.CreateCompatibleDC(pDC);/ 创建内存设备上下文 memDC.Select

10、Object(&m_Bitmap); / 将位图选入设备上下文 BITMAP m_Bmp/声明位图控件m_Bitmap.GetBitmap(&m_Bmp); / 获得位图信息int x = m_Bmp.bmWidth; / 获取图片宽度int y = m_Bmp.bmHeight; / 获取图片高度CRect rect; /声明矩形区域对象GetClientRect(rect);/获取编辑区大小矩形框pDC-StretchBlt(O,O,rect.Width(),rect.Height(),&memDC,O,O,x,y,SRCCOPY);/伸展铺上图片memDC.DeleteDC();释放内存

11、设备上下文return TRUE; /return CEdit:OnEraseBkgnd(pDC);void CBmpEdit:OnChange()In validate。;/刷新用户界面HBRUSH CBmpEdit:CtlColor(CDC* pDC, UINT n CtlColor)pDC-SetBkMode(TRANSPARENT);设置文字背景透明return NULL;void CBmpEdit:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar * pScrollBar)CEdit:OnVScroll(nSBCode, nPos, pScr

12、ollBar);/ 判断滚动条是否滑动Invalidate(); /刷新用户界面void CBmpEdit:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)int n1,n2;7简易文本编辑器n1 = GetScrollPos (SB_VERT);CEdit: :On KeyDow n(n Char, nRepC nt, n Flags);n2 = GetScrollPos (SB_VERT);if (n1 != n2)/判断滚动条是否滑动In validate。;/刷新用户界面BOOL CBmpEdit:OnMouseWheel(UINT nF

13、lags, short zDelta, CPoint pt) BOOL editS = CEdit:O nMouseWheel( nFlags, zDelta, pt);Invalidate();/刷新用户界面return editS;2.2.2 文件新建新建菜单使用的是MFC!带的系统函数中的FILE等函数指令在massageboX勺功能实 现模块,其中在新建文档的时候需要对文本的编辑区进行判断,对文本框中存在的文本 进行存档,而新建的文档就是对文本编辑区进行重绘,对原有的内容进行存储和销毁, 详细代码如下所示:void CEasyTXTDlg:OnMenuNew()/新建前对现有文本的的处

14、理isModified = m_Edit.GetModify(); / 获取文本修改标记CStri ng stri ng;m_Edit.GetWi ndowText(stri ng);if (isNew & string.lsEmpty()/若是新建文本且文本无内容内容Jelse if (isModified) /如果文本已被修改,分情况讨论int Choice = MessageBox(当前文本已被修改,想保存吗?,系统提示, MB_YESNO|MB_ICONQUESTION)单出消息对话框询问9简易文本编辑器if (Choice=IDYES) / 选择“是”OnMenuSave();调用保

15、存函数保存文件新建m_Edit.SetSel(O, -1);/全部选中文本内容m_Edit.Clear(); /将所有文本删除isNew = TRUE; /标记为新建文本m_Edit.SetModify(FALSE); /文本修改标记设为未修改打开菜单栏的打开使用的拖入和图标打开,其中使用了 MF(中自带的打开对话框,这样的使用和拖入的使用均是使用了自带的函数,其中重点是在运行的过程中对绝对路径的获取以及特定格式文件的打开和提取,对不正确的格式进行massagebo)的消息盒子提醒,详细代码如下:void CEasyTXTDIg:OnDropFiles(HDROP hDropInfo)char

16、 *IpszFiIeName= new char 512;int nFileCount,i; nFileCount=:DragQueryFile(hDrop In fo,0xFFFFFFFF,NULL,512);for (i=0;inFileCount;i+)UINT n Chars=:DragQueryFile (hDrop In fo,i,&l pszFileName0,512);CString str(&lpszFileNameO,nChars);/ 获得文件路径 / 打开前对现有文本的的处理isModified = m_Edit.GetModify(); / 获取文本修改标记CStri

17、 ng stri ng;m_Edit.GetWi ndowText(stri ng);if (isNew & string.lsEmpty() /若是新建文本且文本无内容内容Jelse if (isModified) /如果文本已被修改,分情况讨论11简易文本编辑器int Choice = MessageBox当前文本已被修改,想保存吗?,系统提示MB_YESNO|MB_ICONQUESTION)单出消息对话框询问if (Choice=IDYES) / 选择“是”On Me nuSave();调用保存函数保存文件CString strText=;SavePath = str;int n = S

18、avePath.ReverseFind( .);CString stl = SavePath.Right(SavePath.GetLength() - n - 1);if (stl = txt | stl = TXT | stl =c | stl =C | stl =cpp | stl = CPP| stl =h | stl =H | stl = xml | stl = XML | stl=html | stl =HTML)CFile file(str,CFile:modeReadWrite);/ 以读与写方式打开文件/拖入打开m_Edit.SetSel(O, -1);/全部选中文本内容m_E

19、dit.Clear(); /将所有文本删除 char read50000;file.Read(read,50000); / 读取文件内容for (unsigned i=0;ifile.GetLength();i+)strText += readi; /把文件内容赋值给CString变量file.Close(); / 关闭文件m_Edit.SetWi ndowText(strText);isNew = FALSE; /标记为打开文本 m_Edit.SetModify(FALSE); /文本修改标记设为修改elseMessageBox (不支持的文件类型!,打开错误);13简易文本编辑器:Drag

20、Finish (hDropInfo);/ 释放内存i=0;delete lpszFileName;void CEasyTXTDIg:OpenFile()CStri ng strCmdLi ne = GetComma ndLin e();int totalLen = strCmdLine.GetLength();int i = 0;int index = 0;/循环统计字符个数for (i = 0,index = 0; i 3; i+,index +)index = strCmdLine.Find( , index); / 查找字符串if (index != 0)for (i = index;i

21、 totalLen - 1;i +)SavePath += strCmdLi ne.GetAt(i);int n = SavePath.ReverseFind( .);CString stl = SavePath.Right(SavePath.GetLength() - n - 1);if(stl = txt II stl =TXT | stl =c | stl =C | stl =cpp | stl=CPP| stl =h | stl =H | stl =xml | stl =XML | stl=html| stl =HTML)CStri ng strText;CFile file(Save

22、Path,CFile:modeReadWrite);/ 以读与与方式打开文件char read50000;file.R ead(read,50000);/读取文件内容for (unsigned i=0;iCreate(FALSE,NULL);/ 创建“替换”对话框dlg-ShowWindow(SW_SHOW);/ 显示“替换”对话框long CEasyTXTDIg:O nFi ndReplace(WPARAM wParam, LPARAM IParam)CString strText,repText;/ 声明字符串变量strText = dlg-GetFindString();/ 获得查找字符

23、串CString str;/声明字符串变量m_Edit.GetWindowText(str);/ 获得编辑框中是文本int len;if (dlg-ReplaceAll()部替换strText = dlg-GetFi ndStri ng();符串repText = dlg-GetReplaceStri ng();符串len = repText.GetLe ngth();符串长度str.Replace(strText,repText);换查找字符串m_Edit.SetWi ndowText(str);显示在编辑框中nin dex =0; m_Edit.SetModify(TRUE);记设为修改m

24、_Edit.SetSel(0,-1);CRect rect (15,80,586,686);Inv alidateRect(rect);if (dlg-ReplaceCurrent()find = FALSE;/判断是否全/获得查找字/获得替换字/获得替换字/使用替换字符串替/将替换后的字符串/设置查找位置为初始/文本修改标/刷新界面/替换/进行替换elsefind = TRUE;变量if (find)换len = strText.GetLe ngth();串的长度elseCStri ng left,right;int num = strText.GetLength();符串的长度int st

25、rnum = str.GetLength();本长度if (!degree)in dex = str.Fi nd(strText ,nin dex);框文本中的位置if (index GetReplaceStri ng(); len = repText.GetLe ngth();度str = left + repText + right; m_Edit.SetWi ndowText(str);的字符串/进行查找/声明整型/判断是查找还是替/获得要查找字符/声明字符串变量/获得查找字/获得编辑框中文/判断为第一次替换/获得查找字符串在编辑/获得替换字符串左/获得替换字符串/获得替换字符串/获得替

26、换字符串长/组合成新的字符串/在编辑框中显示新/文本修改标记设m_Edit.SetModify(TRUE);为修改strText = dlg-GetFi ndStri ng();m_Edit.GetWi ndowText(str);本index = str.Find (strText,nindex);框文本中的位置m_Edit.SetSel(i ndex,i ndex+strText.GetLe ngth();的字符串nin dex = in dex+le n;if (index = 0)degree = TRUE;elsedegree = FALSE;nin dex = 0;m_Edit.S

27、etFocus();CRect rect1 (15,80,586,686);InvalidateRect(rect1);return 0;字体设置void CEasyTXTDIg:OnMenuFont()/ TODO: Add your con trol no tificati on han dler code here CFont* TempFo nt = m_Edit.GetFo nt();LOGFONT LogFo nt;TempFo nt-GetLogFo nt(&LogFo nt);/CFon tDialog dlg(&LogFo nt);/获得查找字符串/获得编辑框中是文/获得查找

28、字符串在编辑/选中查找或替换/设置起始查找位置/编辑框获得焦点/刷新界面/获取编辑框当前字体获取字体信息初始化字体信息if (dlg.DoModal()=IDOK)m_Fon t.Detach();/分离字体LOGFONT temp;dlg.GetCurre ntFo nt(&temp);m_Fon t.CreateF ontln direct (&temp); m_Edit.SetFo nt(&m _Fo nt);/获取当前字体信息/直接创建字体/设置字体统计字符串void CEasyTXTDIg:OnMenuCountString() CStri ng str;m_Edit.GetWi n

29、dowText(str);CCou ntStri ngDIg dlg;dlg.SetText(str);dlg.DoModal();/获取编辑框文本/声明统计字符串对话框类对象/显示对话框统计字数void CEasyTXTDlg:OnMenuCountAII()intintn TotalLe nth = 0;n CLe nth = 0;/总共字数/中文intn ELe nth = 0;/英文intn NLe nth = 0;/数字intn BLe nth = 0;/空格intnEnLenth = 0;/半角字符intnEn terLe nth = 0;/回车CStri ng strText;m

30、_Edit.GetWi ndowText(strText); int Lenth = strText.GetLength(); for (int i=0;iLenth;i+)char c = strText.GetAt(i);/获取当前字符中文字符if (c255)continue ; /英文字符 elseif (c = r)i +;nEn terLe nth +;elsenEnLenth +;if (c =)n BLe nth +; else if (c= 0n NLe nth +; else if (c= a n ELe nth +;/回车符/跳过n/回车符计数加/空格数加& c= 9 )

31、/数字字符加&c= A & c = 0; nPathEnd-)/获得程序路径if (buffModulPathnPathEnd=)buffModulPath nPathE nd+1= 0 strcat(buffModulPath,CTextName);简易文本编辑器break;str3.Format( %s,(LPCTSTR)buffModulPath);DWORD dwPos;/ 创建“ EasyTXTminiword应用程序”子键 value=RegCreateKeyEx(HKEY_CLASSES_ROOT,dataset1,0,NULL,REG_OPTION_NON_VOLAT ILE,

32、KEY_CREATE_SUB_KEY|KEY_ALL_ACCESS,NULL,&hresult,&dwPos);/ 将该子键的“默认”数据项的数据设置为“用 EasyTXTmi ni word打开”value=RegSetValueEx(hresult,NULL,0,REG_SZ,( const BYTE*)(LPCTSTR)str1,str1.GetLength();/ 创建“ command 子键value=RegCreateKeyEx(HKEY_CLASSES_ROOT,dataset2,0,NULL,REG_OPTION_NON_VOLAT ILE,KEY_CREATE_SUB_KEY

33、|KEY_ALL_ACCESS,NULL,&hresult,&dwPos);/ 将该子键的“默认”数据项的数据设置为EasyTXT应用程序的路径 value=RegSetValueEx(hresult,NULL,0,REG_SZ,( const BYTE*)(LPCTSTR)str2,str2.GetLength();/ 创建 Default 项。value=RegCreateKeyEx(HKEY_CLASSES_ROOT,dataset3lco n,0,NULL,REG_OPTION_NON_V OLATILE,KEY_CREATE_SUB_KEY|KEY_ALL_ACCESS,NULL,&

34、hresult,&dwPos);将该子 键的“默认”数据项的数据设置为“ EasyTXTS标” value=RegSetValueEx(hresult,NULL,0,REG_SZ,( constBYTE*)(LPCTSTR)str3,str3.GetLe ngth();:RegCloseKey(hresult);MessageBox (已将信息写入注册表,系统重启后生效。,系统提示);还原注册注册的还原和注册原理是相同的,不同的是软件的还原注册是对注册表中已经添加 的键值进行删除操作,详细代码如下所示:void CEasyTXTDIg:OnMenuBackUp()int nChoice = M

35、essageBox (即将还原系统注册表。rn确定要还原吗?,还原 信息,MBCONWARNING|MB_YESNO);CStri ng str1,str2,str3;if (nChoice = IDYES)HKEY hresult;long value;LPCTSTR datasetl = txtfileshellOPEN ;/ 打开方式子键LPCTSTR dataset2 = txtfileshellOPENcommand; / 启用程序路径子键LPCTSTR dataset3Icon = txtfileWDefaultlcon;/ 关联图标子键/获得三个子键默认的内容str仁用记事本打开;str2 = %SystemRoot%NotePad.exe %1;str3 = %SystemRoot%system32shell32.dll,-152 ;D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论