C++课程设计--简单文本编辑器的设计.doc_第1页
C++课程设计--简单文本编辑器的设计.doc_第2页
C++课程设计--简单文本编辑器的设计.doc_第3页
C++课程设计--简单文本编辑器的设计.doc_第4页
C++课程设计--简单文本编辑器的设计.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

简易文本编辑器 面向对象程序设计课程设计报告(2011/2012学年第二学期)题目名称 简单文本编辑器的设计 系 部 专 业 计算机科学与技术 班 级 学 生 完成时间 2012年 6 月 指导老师 引 言在文本编辑器出现前,人们用打孔机把计算机文字打到穿孔卡片上。文字存放于一个装着这样的薄卡片的盒子里,可以用读卡器来阅读它。第一个文本编辑器是一种行编辑器,它运行在打字机型的终端上,这种编辑器并不具备在窗口和屏幕中显示的功能。它包含了一些非常短的命令(为了减少打字量)。其中一个命令能够把文件的指定部分通过打字机打印出来。编辑光标是想象中的一个插入点,通过特殊命令,可以把它移动到特定内容字符串所在的行。随后,内容字符串又被扩展成正则表达式。如果想看到文件的变化,你需要把它打印出来。相对于穿孔机来说,人们认为这种基于行的文本编辑器具有革命性的进步。如果没有它,用户就需要把那些处理文本的命令打成专用的卡片,并在编辑文件时使用这些卡片。当带有显示屏的计算机终端出现后,基于显示屏的文本编辑器开始流行起来。最早的全屏编辑器中,有一种叫做o26,它是于1967年为cdc 6000系列机器的操作控制台而作的。另外一个早期的全屏编辑器是vi。vi诞生于20世纪70年代,至今,它仍是unix和linux的标准编辑器。全屏编辑器对视频终端的销售起到了促进的作用。文本编辑器在windows的应用中是一个非常重要的项目,在过去十数年中,微软对windows文本编辑器有多个版本的升级改进,而基于其他的编程环境的文本编辑器也是多如牛毛,今天我们用mfc可视化编译环境做一个简易的文本编辑器。目 录引 言21.课程设计目的和意义42.详细设计42.1需求描述42.1.1文件42.1.2编辑42.1.3应用42.1.4帮助52.1.5高级52.2功能描述52.2.1文本编辑区52.2.2文件62.2.3编辑122.2.4应用132.2.5帮助162.2.6高级172.2.7菜单栏192.2.7图标192.3程序运行说明193.课程设计总结193.1编程日志193.3测试报告204.心得体会205.参考文献20321.课程设计目的和意义面向对象程序设计课程设计是实践性教学环节之一,是面向对象程序设计课程的辅助教学课程。该课程设计要求学生综合运用在面向对象程序设计课程中学到的面向对象技术与实际编程相结合,独立完成一项较为完整、并具有一定实际功能的课程设计任务,同时加深学生对面向对象和c+编程技术的理解和掌握,培养实际的应用程序开发能力。在课程设计过程中,使学生养成良好的程序设计风格,并掌握c+应用程序的设计开发过程和编程方法、测试方法2.详细设计2.1需求描述简单文本编辑器的设计是基于microsoft visual studio 2008开发的一款小型的软件,主要的设计是为了满足普通用户对文本文档进行一般的简单操作,通过mfc可视化编程环境,直接生成一个友好的用户操作界面,通过这个窗口,用户可以对文本进行如下的基本操作。2.1.1文件 新建:创建一篇空白文档,从“工具栏”或“文件下拉菜单”中创建 打开:打开文本(.txt)文件,从“工具栏”或“文件下拉菜单”中打开;或将文本(.txt)文件拖入程序界面打开或应用程序图标上打开;或右键单击文本文件,在“打开方式”中选择本程序打开 保存:保存文档,从“工具栏”或“文件下拉菜单”中打开 另存为:保存文件副本,在不同位置或以不同文件名保存文档,从“工具栏”或“文件下拉菜单”中另存2.1.2编辑 撤销:撤销前一步所进行的操作,从“编辑下拉菜单”或“右键菜单”中撤销 删除:删除当前选定字符(串),从“编辑下拉菜单”或“右键菜单”中删除 剪切:复制并删除选定字符(串),从“编辑下拉菜单”或“右键菜单”中剪切 复制:复制选定字符(串),“编辑下拉菜单”或“右键菜单”中复制 粘贴:对粘贴内容进行粘贴,从“编辑下拉菜单”或“右键菜单”中粘贴 全选:对文本编辑框中文本全部选定,从“编辑下拉菜单”或“右键菜单”中全2.1.3应用 查找/替换:输入查找内容(和替换内容),可从光标位置逐个查找(或替换)相应内容,也可一次性全部替换掉相应内容,从“工具栏”或“应用下拉菜单”中执行 字体设置:设置字体、字形及字的大小,从“工具栏”或“应用下拉菜单”中设置字体 统计字符串:统计用户输入的字符串出现次数,从“工具栏”或“应用下拉菜单”中执行 统计字数:统计所有字符数、中文字符数、英文字符数、数字字符数和空格数,从“工具栏”或“应用下拉菜单”中启动2.1.4帮助 关于easytxt:显示关于本程序的信息,从“帮助下拉菜单”中启动 帮助:显示程序帮助文档,包括程序功能、使用、简要说明等各种信息,从“工具栏”或“帮助下拉菜单”中启动2.1.5高级关联注册:向注册表添加slw文件关联,改变文本(.txt)文件图标,并使文本(.txt)文件可单击右键后选择用本程序打开(部分功能重启或注销后方能生效)还原注册:取消注册,文本(.txt)文件还原为默认图标,不能右键打开(部分功能重启或注销后方能生效)2.2功能描述2.2.1文本编辑区本程序的编译框架为mfc,功能的实现使用的是模块化的编程方式进行,由于使用的是mfc可视化编程,所以其中的很多过程使用的是相关的系统自带函数实现的,其中整个编辑器的编辑区使用的是mfc自动生成的文本框,但是这个文本框没有插入符,不能实现文字编辑功能,所以需要在程序的ceasytxtview中插入一些特定的文本编辑函数,如插入符函数cwnd:createsolidcreat,这个函数默认的为隐藏,所以在后面需要showcreate()才能正常显示,而整个编辑器的操作编辑部分使用的是一个独立的*.cpp进行控制的,代码中使用的是图形至于文本输入的下方并设置为透明,在下面的文本编辑区下层有一张写有内容的图片作为装饰,换行等动作惠济路插入符位置并按照坐标进行绘制,文本框的大小改变等会导致文本编辑区的重绘,所以在改变文本框时必须调用函数对文本框中的内容进行保存,相关代码如下所示:bool cbmpedit:onerasebkgnd(cdc* pdc) cdc memdc;memdc.createcompatibledc(pdc);/创建内存设备上下文memdc.selectobject(&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(0,0,rect.width(),rect.height(),&memdc,0,0,x,y,srccopy); /伸展铺上图片memdc.deletedc();/释放内存设备上下文return true;/return cedit:onerasebkgnd(pdc);void cbmpedit:onchange() invalidate();/刷新用户界面hbrush cbmpedit:ctlcolor(cdc* pdc, uint nctlcolor) pdc-setbkmode(transparent); /设置文字背景透明return null;void cbmpedit:onvscroll(uint nsbcode, uint npos, cscrollbar * pscrollbar) cedit:onvscroll(nsbcode, npos, pscrollbar);/判断滚动条是否滑动invalidate();/刷新用户界面void cbmpedit:onkeydown(uint nchar, uint nrepcnt, uint nflags) int n1,n2;n1 = getscrollpos (sb_vert);cedit:onkeydown(nchar, nrepcnt, nflags);n2 = getscrollpos (sb_vert);if (n1 != n2)/判断滚动条是否滑动invalidate();/刷新用户界面bool cbmpedit:onmousewheel(uint nflags, short zdelta, cpoint pt) bool edits = cedit:onmousewheel(nflags, zdelta, pt);invalidate();/刷新用户界面return edits;2.2.2文件新建新建菜单使用的是mfc自带的系统函数中的file等函数指令在massagebox的功能实现模块,其中在新建文档的时候需要对文本的编辑区进行判断,对文本框中存在的文本进行存档,而新建的文档就是对文本编辑区进行重绘,对原有的内容进行存储和销毁,详细代码如下所示:void ceasytxtdlg:onmenunew()/新建前对现有文本的的处理ismodified = m_edit.getmodify();/获取文本修改标记cstring string;m_edit.getwindowtext(string);if (isnew & string.isempty()/若是新建文本且文本无内容内容;else if(ismodified) /如果文本已被修改,分情况讨论 int choice = messagebox(当前文本已被修改,想保存吗?,系统提示,mb_yesno|mb_iconquestion); /弹出消息对话框询问 if(choice=idyes) /选择“是”onmenusave();/调用保存函数保存文件/新建m_edit.setsel(0, -1); /全部选中文本内容m_edit.clear();/将所有文本删除isnew = true; /标记为新建文本m_edit.setmodify(false); /文本修改标记设为未修改打开菜单栏的打开使用的拖入和图标打开,其中使用了mfc中自带的打开对话框,这样的使用和拖入的使用均是使用了自带的函数,其中重点是在运行的过程中对绝对路径的获取以及特定格式文件的打开和提取,对不正确的格式进行massagebox的消息盒子提醒,详细代码如下:void ceasytxtdlg:ondropfiles(hdrop hdropinfo) char *lpszfilename=new char512; int nfilecount,i; nfilecount=:dragqueryfile (hdropinfo,0xffffffff,null,512); for (i=0;infilecount;i+) uint nchars=:dragqueryfile (hdropinfo,i,&lpszfilename0,512); cstring str(&lpszfilename0,nchars); /获得文件路径/打开前对现有文本的的处理ismodified = m_edit.getmodify();/获取文本修改标记cstring string;m_edit.getwindowtext(string);if (isnew & string.isempty()/若是新建文本且文本无内容内容;else if(ismodified) /如果文本已被修改,分情况讨论int choice = messagebox(当前文本已被修改,想保存吗?,系统提示,mb_yesno|mb_iconquestion); /弹出消息对话框询问if(choice=idyes) /选择“是”onmenusave();/调用保存函数保存文件cstring strtext=;savepath = str;int n = savepath.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(0, -1); /全部选中文本内容m_edit.clear();/将所有文本删除char read50000;file.read(read,50000); /读取文件内容for(unsigned i=0;ifile.getlength();i+)strtext += readi; /把文件内容赋值给cstring变量file.close();/关闭文件m_edit.setwindowtext(strtext);isnew = false; /标记为打开文本m_edit.setmodify(false); /文本修改标记设为修改elsemessagebox (不支持的文件类型!,打开错误); :dragfinish (hdropinfo); /释放内存i=0;delete lpszfilename; void ceasytxtdlg:openfile()cstring strcmdline = getcommandline();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 totallen - 1;i +)savepath += strcmdline.getat(i);int n = savepath.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)cstring strtext;cfile file(savepath,cfile:modereadwrite); /以读与写方式打开文件char read50000;file.read(read,50000); /读取文件内容for(unsigned i=0;icreate(false,null);/创建“替换”对话框dlg-showwindow(sw_show);/显示“替换”对话框long ceasytxtdlg:onfindreplace(wparam wparam, lparam lparam)cstring strtext,reptext;/声明字符串变量strtext = dlg-getfindstring();/获得查找字符串cstring str;/声明字符串变量m_edit.getwindowtext(str);/获得编辑框中是文本int len;if(dlg-replaceall()/判断是否全部替换strtext = dlg-getfindstring();/获得查找字符串reptext = dlg-getreplacestring();/获得替换字符串len = reptext.getlength();/获得替换字符串长度str.replace(strtext,reptext);/使用替换字符串替换查找字符串m_edit.setwindowtext(str);/将替换后的字符串显示在编辑框中nindex =0;/设置查找位置为初始m_edit.setmodify(true); /文本修改标记设为修改m_edit.setsel(0,-1);crect rect (15,80,586,686);invalidaterect(rect);/刷新界面if(dlg-replacecurrent()/替换find = false;/进行替换elsefind = true;/进行查找/声明整型变量if(find)/判断是查找还是替换len = strtext.getlength();/获得要查找字符串的长度elsecstring left,right;/声明字符串变量int num = strtext.getlength();/获得查找字符串的长度int strnum = str.getlength();/获得编辑框中文本长度if(!degree)/判断为第一次替换index = str.find(strtext,nindex);/获得查找字符串在编辑框文本中的位置if(index getreplacestring();/获得替换字符串len = reptext.getlength();/获得替换字符串长度str = left + reptext + right;/组合成新的字符串m_edit.setwindowtext(str);/在编辑框中显示新的字符串m_edit.setmodify(true); /文本修改标记设为修改strtext = dlg-getfindstring();/获得查找字符串m_edit.getwindowtext(str);/获得编辑框中是文本index = str.find (strtext,nindex);/获得查找字符串在编辑框文本中的位置m_edit.setsel(index,index+strtext.getlength();/选中查找或替换的字符串nindex = index+len;/设置起始查找位置if (index = 0)degree = true;elsedegree = false;nindex = 0;m_edit.setfocus();/编辑框获得焦点crect rect1 (15,80,586,686);invalidaterect(rect1);/刷新界面return 0;字体设置void ceasytxtdlg:onmenufont()/ todo: add your control notification handler code herecfont* tempfont = m_edit.getfont(); /获取编辑框当前字体logfont logfont;tempfont-getlogfont(&logfont);/获取字体信息cfontdialog dlg(&logfont);/初始化字体信息if(dlg.domodal()=idok)m_font.detach(); /分离字体logfont temp;dlg.getcurrentfont(&temp);/获取当前字体信息m_font.createfontindirect(&temp);/直接创建字体m_edit.setfont(&m_font);/设置字体统计字符串void ceasytxtdlg:onmenucountstring()cstring str;m_edit.getwindowtext(str);/获取编辑框文本ccountstringdlg dlg;/声明统计字符串对话框类对象 dlg.settext(str);dlg.domodal();/显示对话框统计字数void ceasytxtdlg:onmenucountall()int ntotallenth = 0;/总共字数int nclenth = 0;/中文 int nelenth = 0;/英文 int nnlenth = 0;/数字int nblenth = 0;/空格int nenlenth = 0;/半角字符int nenterlenth = 0;/回车cstring strtext;m_edit.getwindowtext(strtext);int lenth = strtext.getlength();for(int i=0;ilenth;i+) char c = strtext.getat(i);/获取当前字符中文字符 if(c255) continue;/英文字符 else if(c = r)/回车符i +;/跳过nnenterlenth +;/回车符计数加elsenenlenth +;if (c = )/空格数加nblenth +;else if (c=0 & c=a&c=a & c = 0; npathend -)/获得程序路径 if (buffmodulpathnpathend=) buffmodulpathnpathend+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_volatile,key_create_sub_k

温馨提示

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

评论

0/150

提交评论