收藏 分销(赏)

专业课程设计文本编辑器的设计.doc

上传人:天**** 文档编号:2727141 上传时间:2024-06-05 格式:DOC 页数:48 大小:258.54KB 下载积分:12 金币
下载 相关 举报
专业课程设计文本编辑器的设计.doc_第1页
第1页 / 共48页
专业课程设计文本编辑器的设计.doc_第2页
第2页 / 共48页


点击查看更多>>
资源描述
学号 - 第2学期 《高档语言程序设计》 课程设计报告 题目: 文本编辑器设计 专业: 计算机科学与技术 班级: 14计科一班 姓名: 彭鑫 指引教师: 王峻 成绩: 计算机学院 4月24日 目 录 1 设计内容及规定 2 1.1设计内容 2 1.2详细规定 2 2 概要设计 2 2.1系统功能简介 2 2.2系统功能模块图 3 2.3各个模块之间重要关系 3 3 详细设计 4 3.1文献操作 4 3.2编辑操作 9 3.3工具操作 17 4 程序运营成果与调试 19 4.1 在调试过程中浮现某些问题 19 4.2 实验成果 20 5 课程设计总结与感想 24 参照文献 24 源代码 25 1 设计内容及规定 1.1设计内容 该文本编辑器运营后弹出文本编辑器主界面,由键盘输入或以打开方式输入或显示文本文献内容。其中程序编辑项可对当前文本进行撤销、删除、剪切、复制、粘贴、在文本里显示当前时间、全选、清除、查找、替代、记录等功能。程序文献项可以对电脑上txt,c++等格式文献打开、对当前文本保存和另存、对当前文本新建以及退出文本编辑系统。程序工具项为背景音乐,为顾客提供了优美动听音乐,仅在顾客编辑疲倦乏力时候尽情享用。最后在程序协助项有对该小型文本编辑器关于,用来简介该程序,尚有访问链接百度,访问114网页大全,为顾客提供查找资料等功能服务。 1.2详细规定 基本规定:编辑器应具备对文本文献打开、保存、新建、查找、插人、删除、修改、字符串替代、记录字数,记录行数等功能,对于超过一屏长文献,应可以分页显示。设计顾客接口命令,实现对文本编辑 2 概要设计 2.1系统功能简介 输入一页文字,程序实现文字、数字、空格记录;可以删除一行信息;查找定位单词;定行位置插入;文献存盘;装入文献;并能显示输入及其她功能。 2.2系统功能模块图 文本编辑器 文献 编辑 工具 协助 新建 打开 保存 另存 退出 复制 粘贴 剪切 清空 删除 清空 撤销 查找 替代 记录 全选 背景音乐 关于 连接百度 连接114 运营所需环境:win7及如下各版本windows,visual C++6.0。 2.3各个模块之间重要关系 该系统功能重要是实现文本输入,并对文本相应信息进行操作。各个模块之间关系是互相联系。一方面,主函数包括了所有子函数。主函数是整个系统核心。子函数之间也是有联系,对文本信息显示、删除、记录、查找、插入,存储,装入,必要是在文本信息输入状况下进行。因而对文本输入是非常重要。在文本删除、记录、查找、插入、存储、装入、保存所有子函数之间是没有多大联系。 3 详细设计 3.1文献操作 (1)文献新建实现: int ret=MessageBox(NULL,TEXT("与否把更改保存到新建文本文档!!!"),TEXT("温馨提示"),MB_YESNO | MB_ICONQUESTION); if(ret==IDYES) //依照选取如果保存 { OPENFILENAME ofn; //文献对象 char szFile[MAX_PATH];//文献大小,最大 ZeroMemory(&ofn,sizeof(ofn));//文献初始化 ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = TEXT('\0'); ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0C++\0*.cpp\0"); //保存  文献类型 ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.hwndOwner = hwnd; ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; ofn.lpstrTitle=TEXT("保存"); if (GetSaveFileName(&ofn)) { FILE *fp; fp=fopen(szFile,"w"); //打开文献 if(fp==NULL) { MessageBox(NULL,TEXT("文献无法保存"),TEXT("呜呜"),MB_OK); } TCHAR str[10000]; TCHAR end[10000]; memset(end,0,10000); GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str)); fputs(str,fp); fclose(fp); } SetDlgItemText(hwnd,IDC_EDIT1,""); } else { SetDlgItemText(hwnd,IDC_EDIT1,""); } (2)文献打开实现: case ID_MENUITEMOPEN: //文本打开 { OPENFILENAME ofn; char szFile[MAX_PATH]; //保存途径变量 ZeroMemory(&ofn,sizeof(ofn)); 在这里咱们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,看一下ZeroMemory定义: ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; //szFile是一种字符数组,那么szFile这个名字就代表这个字符数组首地址 这是一种指针应用,把接受选取文献名数组地址传递到GetOpenFileName函数中。 ofn.lpstrFile[0] = TEXT('\0'); ofn.lpstrFile[0] = TEXT('\0');效果等价于ZeroMemory(szFile,sizeof(szFile)/sizeof(char)); ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.txt\0"); 文献过滤器 *.*就表达所有文献 *.txt就表达所有文本文献 abc*.*就表达所有以abc开头文献 abc*.txt就表达所有以abc开头文本文献(txt) ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");用“\0”分割出几种段,每两段是一组过滤器,每组第一种段代表过滤器显示值,而第二段表达真正过滤器 ofn.nFilterIndex = 1; //选取一种过滤器 ofn.lpstrFileTitle = NULL; windows一种惯例:构造体指针类型别名普通是LP+构造体名字 GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),由于GetOpenFileName函数要是OPENFILENAME指针 (8)只要顾客还没关闭对话框,那么GetOpenFileName函数是停住,同步模式PlaySound以及getchar、scanf是同样。 顾客关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表达顾客选取了文献,如果等于FALSE就表达顾客选取了【取消】按钮 ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.hwndOwner = hwnd; ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn)) { FILE *fp; fp=fopen(szFile,"r"); if(fp==NULL) { MessageBox(NULL,TEXT("文献打开错误!"),TEXT("记事本"),MB_OK); } TCHAR line[256]; TCHAR end[10000]; memset(line,0,256); memset(end,0,256); while(!feof(fp)) { fgets(line,sizeof(line),fp); lstrcat(end,line); int w=strlen(end); end[w-1]='\0'; lstrcat(end,"\r\n"); } SetDlgItemText(hwnd,IDC_RICHEDIT1,end); fclose(fp); //关闭文献 } break; } break; (3)文献保存实现: case ID_MENUITEMSAVE: //文本保存 { OPENFILENAME ofnb; char bcFile[MAX_PATH]; ZeroMemory(&ofnb,sizeof(ofnb)); ofnb.lStructSize = sizeof(ofnb); ofnb.lpstrFile = bcFile; ofnb.lpstrFile[0] = TEXT('\0'); ofnb.nMaxFile = sizeof(bcFile); ofnb.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.txt\0"); ofnb.nFilterIndex = 1; ofnb.lpstrFileTitle = NULL; ofnb.nMaxFileTitle = 0; ofnb.lpstrInitialDir = NULL; ofnb.hwndOwner = hwnd; ofnb.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT; if (GetSaveFileName(&ofnb)) { FILE * fp = fopen (".txt","w"); //保存所有文献都为txt格式 TCHAR baoc [100000]; //保存最大容量为100000 GetDlgItemText(hwnd,IDC_RICHEDIT1,baoc,sizeof(baoc)); fputs(baoc,fp); fclose(fp); } } break; (4)退出文本编辑器实现: int ret=MessageBox(NULL,TEXT("与否把更改保存到新建文本文档!!!"),TEXT("温馨提示"),MB_YESNO | MB_ICONQUESTION); if(ret==IDYES) { OPENFILENAME ofn; char szFile[MAX_PATH]; ZeroMemory(&ofn,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = TEXT('\0'); ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0C++\0*.cpp\0"); ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.hwndOwner = hwnd; ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; ofn.lpstrTitle=TEXT("保存"); if (GetSaveFileName(&ofn)) { FILE *fp; fp=fopen(szFile,"w"); if(fp==NULL) { MessageBox(NULL,TEXT("文献无法保存"),TEXT("呜呜"),MB_OK); } TCHAR str[10000]; TCHAR end[10000]; memset(end,0,10000); GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str)); fputs(str,fp); fclose(fp); } MessageBox(NULL,TEXT("文献保存成功!放心关闭!!!"),TEXT("嘻嘻"),MB_OK); } EndDialog(hwnd,0); 3.2编辑操作: (1)剪切实现: case ID_MENUITEMCUT: //剪切 { SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_CUT,0,0); //传递对话框中内容一方面获取RichEdit中内容,WM_CUT,传递要进行操作内容,0,0为两个WPARAM和LPARAM是商定消息参数类型。 break; } (2)复制实现: case ID_MENUITEMCOPY: //复制 { SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_COPY,0,0); //传递对话框中内容一方面获取RichEdit中内容,WM_COPY,,传递要进行操作内容,0,0为两个WPARAM和LPARAM是商定消息参数类型。 break; } (3)粘贴实现: case ID_MENUITEMPASTE: //粘贴 { SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_PASTE,0,0); break; } (4)清除实现: case ID_MENUITEMEMPTY: //清除 { SetDlgItemText(hwnd,IDC_RICHEDIT1,""); break; } (5)撤销实现: case ID_MENUITEMUNDO: //“撤销”菜单 { SendDlgItemMessage(hwnd,IDC_RICHEDIT1,EM_UNDO,0,0); break; } (6)删除实现: case ID_MENUITEMDELETE: //删除 { SendMessage(GetDlgItem(hwnd,IDC_RICHEDIT1),WM_CLEAR,0,0); } break; (7)全选实现: case ID_MENUITEMSELECTALL: //全选 { SendMessage(GetDlgItem(hwnd,IDC_RICHEDIT1),EM_SETSEL,0,-1); } break; (8)系统时间实现: VOID CALLBACK MyTimerFun(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime) { SYSTEMTIME strLocal; //当前时间 GetLocalTime(&strLocal); TCHAR str[256]; wsprintf(str,"%04d-%02d-%02d %02d:%02d:%02d",strLocal.wYear,strLocal.wMonth, strLocal.wDay,strLocal.wHour,strLocal.wMinute,strLocal.wSecond); SetDlgItemText(hwnd,IDC_EDIT2,str); } (9)查找功能实现: int count=0; int Line_count=1; int Row_count=1; int num=0; int flag=0; TCHAR str1[256]; TCHAR temp1[5000]; TCHAR temp2[5000]; memset(temp1,0,5000); memset(temp2,0,5000); memset(str1,0,256); GetDlgItemText(hwnd,IDC_EDIT_FINDWORD,str1,sizeof(str1)); if(strlen(str1)==0) { MessageBox(NULL,TEXT("查找内容为空,请输入内容后再查找!!!"),TEXT("呜呜"),MB_OK); } else { int i=0; int j=0; while(str2[i]!='\0' ) { if((str2[i]=='\n') || (Row_count==63)) { Line_count++; Row_count=0; } if(str2[i]==str1[j]) { i++; j++; Row_count++; if(str1[j]=='\0') { j=0; count++; wsprintf(temp2,"<%i>你要寻找内容在第:%i 行,第:%i 列至第:%i 列!!!",count,Line_count,(Row_count-strlen(str1)),(Row_count-1)); strcat(temp1,temp2); strcat(temp1,"\r\n"); flag=1; } } else { i=i-j+1; j=0; Row_count++; } if(str2[i]=='\0' && flag==1) { SetDlgItemText(hwnd,IDC_EDIT2,temp1); MessageBox(NULL,temp1,TEXT("嘿嘿"),MB_OK); } if(str2[i]=='\0' && flag==0) { MessageBox(NULL,TEXT("没有你想要找内容,请重新输入查找内容"),TEXT("呜呜"),MB_OK); break; } } } } break; 通过简朴字符串比配算法实现其功能。 (10)替代功能实现: TCHAR *change::D_change(TCHAR S[],TCHAR T1[] ,TCHAR T2[]) //替代功能主算法 { int i=0; int j=0; int k=0; int l=0; TCHAR *S1; while((S[i]!='\0')) { if(S[i]==T1[j]) { i++; j++; count1=i; } else { i=i-j+1; j=0; count1=i; } if(T1[j]=='\0') { i=i-j; if(strlen(T1)==strlen(T2)) { int num1=strlen(T1); for(k=i;k<i+num1;k++) { S[k]=T2[l]; l++; } j=0; l=0; } else if(strlen(T1)>strlen(T2)) { int num2=strlen(T1)-strlen(T2); int lengthT2=strlen(T2); for(k=i;k<strlen(S)-num2;k++) { S[k]=S[k+num2]; } for(k=(strlen(S)-num2);k<=strlen(S);k++) { S[k]='\0'; } for(k=i;k<(i+lengthT2);k++) { S[k]=T2[l]; l++; } j=0; l=0; } else if(strlen(T1)<strlen(T2)) { int num3=strlen(T2)-strlen(T1); S1=new TCHAR[strlen(S)+num3]; for(int k=0;k<i;k++) { S1[k]=S[k]; } for(int k2=i;k2<strlen(T2)+i;k2++) { S1[k2]=T2[k2-i]; } for(int k3=i+strlen(T1);k3<strlen(S);k3++) { S1[k3+num3]=S[k3]; } S1[k3+num3]='\0'; if(S[i]=='\0') { return S1; } else { strcpy(S,S1); j=0; } } } } return S; } 也通过字符算比配,一一找到后,一一替代,最后返回替代后文本内容; (11)记录功能实现: void Total_OnCommand(HWND hwnd,int id,HWND hwndCtl,UINT codeNotify) { int Line_count=1; int Row_count=0; int Total_count=0; int English_count=0; int math_count=0; int other_count=0; int space_count=0; int punct_count=0; TCHAR temp1[256]; TCHAR temp2[256]; memset(temp1,0,256); memset(temp2,0,256); int i=0; while(total2[i]!='\0') { if((total2[i]!=' ') && (total2[i]!='\r') && (total2[i]!='\n')) { Total_count++; } if((total2[i]>='a' && total2[i]<='z') || (total2[i]>='A' && total2[i]<='Z')) { English_count++; } if(total2[i]>='0' && total2[i]<='9') { math_count++; } if(total2[i]==33 || total2[i]==34 || total2[i]==39 || total2[i]==44 || total2[i]==46 || total2[i]==58 || total2[i]==59 || total2[i]==63) { punct_count++; } if(total2[i]==' ') { space_count++; } if((total2[i]=='\n') || (Row_count==62)) { Line_count++; Row_count=0; } else { Row_count++; } i++; } other_count=Total_count-English_count-math_count-punct_count; wsprintf(temp2,"<1>文本行数为:%i !",Line_count-1); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); wsprintf(temp2,"<2>文本总字符数为:%i !",Total_count); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); wsprintf(temp2,"<3>文本英文字符数为:%i !",English_count); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); wsprintf(temp2,"<4>文本数字字符数为:%i !",math_count); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); wsprintf(temp2,"<5>文本空格数为:%i !",space_count); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); wsprintf(temp2,"<6>文本标点符号数为:%i !",punct_count); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); wsprintf(temp2,"<7>文本其他字符数为:%i !",other_count); strcat(temp1,temp2); strcat(temp1,"\r\n"); memset(temp2,0,256); SetDlgItemText(hwnd,IDC_EDIT1,temp1); } 通过传参,把文本信息传到副对话框中。然后对文本进行各项简朴记录 3.3工具操作: (1)北京音乐实现: case ID_MENU_MUSIC: { TCHAR shortPath[MAX_PATH]; GetShortPathName("C:\\Documents and Settings\\user\\桌面\\edit\\邓紫棋 - 寂寞星球玫瑰.mp3",shortPath,sizeof(shortPath)); //获取音乐途径 TCHAR cmd[MAX_PATH+10]; wsprintf(cmd,"play %s",shortPath); mciSendString(cmd," ",0,NULL); int ret = MessageBox(NULL,TEXT("你当前正在享有音乐!!!与否要退出"),TEXT("嘻嘻"),MB_YESNO | MB_ICONQUESTION); if(ret==IDYES) { MessageBox(NULL,TEXT("还好听吧!欢迎再欣赏!再会!!!"),TEXT("嘿嘿"),MB_OK); mciSendString("CLOSE cmd"," ",0,NULL); break; } else { break; } break; } 重要是通过mciSendString()API函数使用。 3.4关于操作: (1)关于对话框弹出实现: case ID_MENU_ABOUT: { HINSTANCE hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); DialogBox(hInstance,MAKEINTRESOURCE(IDD_ABOUT),NULL,Main_Proc); break; } 用DialogBox()函数实现对话框弹出。 (2)访问百度实现: case IDM_百度: //访问百度网 { ShellExecute(hwnd,TEXT("open"),TEXT("www.百度.com"),NULL,NULL,SW_SHOWNORMAL); break; } (3)访问114实现: case IDM_GOOGLE: { ShellExecute(hwnd,TEXT("open"),TEXT(""),NULL,NULL,SW_SHOWNORMAL); break; } 都是ShellExecute()函数使用。 4 程序运营成果与调试 4.1在调试过程中浮现某些问题 (1)输入语句中没有加取地址符号& (2)误把取地址运算符&当作逻辑与&& (3)误把赋值=当恒等== (4)条件语句(if)后误加分号 (5)循环语句中变化了循环变量 (6)作为输出成果变量没有赋初值 4.2 实验成果 (1)记事本主界面 (2)编辑器中操作项 (3)编辑器中编辑项 (4)编辑器中工具项 (5)编辑器中协助项 (6)打开文献测试 (7)查找项测试 (8)替代项测试 (9)替代项测试 5 课程设计总结与感想 通过本次课程设计,我学到了诸多:增强了查阅有关参照资料能力;独立分析解决问题能力;创新精神;自己上机动手能力;自己对课程设计理解,得到诸多启示,懂得了后来要加强哪一方面,尚有哪一方面有用,课程设计为咱们提供了一种即动手又动脑、独立实践机会,将课本上知识理论和实际有机结合起来,锻炼了咱们分析解决实际问题能力。提高离咱们适应实际,实践编程能力。 参照文献: [1] 谭浩强 《c++面向对象程序设计》 清华大学出版社 [2] 王红梅、胡明、王涛 《数据构造(C++版)》 清华大学出版社 [3] 如鹏网 《c语言也能看大事 》 如鹏网 源代码 int ret=MessageBox(NULL,TEXT("与否把更改保存到新建文本文档!!!"),TEXT("温馨提示"),MB_YESNO | MB_ICONQUESTION); if(ret==IDYES) //依照选取如果保存 { OPENFILENAME ofn; //文献对象 char szFile[MAX_PATH];//文献大小,最大 ZeroMemory(&ofn,sizeof(ofn));//文献初始化 ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = TEXT('\0'); ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0C++\0*.cpp\0"); //保存文献类型
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服