1、学号 2023-2023学年 第2学期 《高级语言程序设计》 课程设计报告 题目: 文本编辑器的设计 专业: 计算机科学与技术 班级: 14计科一班 姓名: 彭鑫 指导教师: 王峻 成绩: 计算机学院 2023年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、2编辑操作 9 3.3工具操作 17 4 程序运营结果与调试 19 4.1 在调试过程中出现的一些问题 19 4.2 实验结果 20 5 课程设计总结与感想 24 参考文献 24 源代码 25 1 设计内容及规定 1.1设计内容 该文本编辑器运营后弹出文本编辑器的主界面,由键盘输入或以打开的方式输入或显示文本文献内容。其中程序的编辑项可对当前的文本进行撤消、删除、剪切、复制、粘贴、在文本里显示当前时间、全选、清除、查找、替换、记录等功能。程序的文献项可以对电脑上tx
3、t,c++等格式文献的打开、对当前文本的保存和另存、对当前文本的的新建以及退出文本编辑系统。程序的工具项为背景音乐,为用户提供了优美动听的音乐,仅在用户编辑疲倦乏力的时候尽情的享用。最后在程序的帮助项有对该小型文本编辑器的关于,用来介绍该程序,尚有访问链接百度,访问114网页大全,为用户提供查找资料等功能服务。 1.2具体规定 基本规定:编辑器应具有对文本文献的打开、保存、新建、查找、插人、删除、修改、字符串替换、记录字数,记录行数等功能,对于超过一屏的长文献,应可以分页显示。设计用户接口命令,实现对文本的编辑 2 概要设计 2.1系统的功能简介 输入一页文字,程序实现文字
4、数字、空格的记录;可以删除一行信息;查找定位单词;定行位置插入;文献存盘;装入文献;并能显示输入及其他功能。 2.2系统功能模块图 文本编辑器 文献 编辑 工具 帮助 新建 打开 保存 另存 退出 复制 粘贴 剪切 清空 删除 清空 撤消 查找 替换 记录 全选 背景音乐 关于 连接百度 连接114 运营所需环境:win7及以下各版本windows,visual C++6.0。 2.3各个模块之间的重要关系 该系统的功能重要是实现文本的输入,并对文本的相应信息进行的操作。各个模块之间的关系是互相联系的。一方面,主函数包含了所
5、有的子函数。主函数是整个系统的核心。子函数之间也是有联系的,对文本信息的显示、删除、记录、查找、插入,存储,装入,必须是在文本信息输入的情况下进行的。因此对文本的输入是非常重要的。在文本的删除、记录、查找、插入、存储、装入、保存所有的子函数之间是没有多大联系的。 3 具体设计 3.1文献操作 (1)文献的新建的实现: int ret=MessageBox(NULL,TEXT("是否把更改保存到新建的文本文档!!!"),TEXT("温馨提醒"),MB_YESNO | MB_ICONQUESTION); if(ret==IDYES) //根据选择假如保存
6、 { 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.lpstrFi
7、lter = 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;
8、 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];
9、 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:
10、 //文本的打开 { OPENFILENAME ofn; char szFile[MAX_PATH]; //保存途径变量 ZeroMemory(&ofn,sizeof(ofn)); 在这里我们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,看一下ZeroMemory的定义: ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; //szFile是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址 这是一个指针的应用,把接受选择文献
11、名的数组的地址传递到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开头的文
12、献 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),由于
13、GetOpenFileName函数要的是OPENFILENAME的指针 (8)只要用户还没关闭对话框,那么GetOpenFileName函数是停住的,同步模式的PlaySound以及getchar、scanf是同样的。 用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表达用户选择了文献,假如等于FALSE就表达用户选择了【取消】按钮 ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.hwndOwner = hwnd; ofn.Flags = OFN_EXPLOR
14、ER |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,
15、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 I
16、D_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*.*\0
17、Text\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)) { FIL
18、E * 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_YESN
19、O | 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
20、\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 *f
21、p; 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("文
22、献保存成功!放心关闭!!!"),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_MENUIT
23、EMCOPY: //复制 { 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;
24、 } (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
25、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 CALLBA
26、CK 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); S
27、etDlgItemText(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(temp
28、2,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]!='\
29、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;
30、 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
31、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("没有你想要找的内容,请重新输入查找的
32、内容"),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]==
33、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
34、en(T1)>strlen(T2))
{
int num2=strlen(T1)-strlen(T2);
int lengthT2=strlen(T2);
for(k=i;k 35、
}
j=0;
l=0;
}
else if(strlen(T1) 36、1);k3 37、WND 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;
w 38、hile(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++;
} 39、
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_coun 40、t=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);
strca 41、t(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, 42、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);
s 43、trcat(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\ 44、\邓紫棋 - 寂寞星球的玫瑰.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)
45、{
MessageBox(NULL,TEXT("还好听吧!欢迎再欣赏!再见!!!"),TEXT("嘿嘿"),MB_OK);
mciSendString("CLOSE cmd"," ",0,NULL);
break;
}
else
{
break;
}
break;
}
重要是通过mciSendString()API函数的使用。
3.4关于操作:
(1)关于对话框的弹出实现:
case ID_MENU_ABOUT:
{
46、 HINSTANCE hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUT), NULL, Main_Proc);
break;
}
用DialogBox()函数实现对话框的弹出。
(2)访问百度实现:
case IDM_BAIDU: //访问百度网
{
ShellExecute(hwnd,TEXT("open"),TEXT(".com"),NULL,NULL,SW 47、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)循环语句 48、中改变了循环变量
(6)作为输出结果的变量没有赋初值
4.2 实验结果
(1)记事本的主界面
(2)编辑器中的操作项
(3)编辑器中的编辑项
(4)编辑器中的工具项
(5)编辑器中的帮助项
(6)打开文献测试
(7)查找项测试
(8)替换项测试
(9)替换项测试
5 课程设计总结与感想
通过本次课程设计,我学到了很多:增强了查阅相关参考资料的能力;独立分析解决 49、问题的能力;创新精神;自己的上机动手的能力;自己对课程设计的理解,得到很多启示,知道了以后要加强哪一方面,尚有哪一方面有用,课程设计为我们提供了一个即动手又动脑、独立实践的机会,将课本上的知识理论和实际有机的结合起来,锻炼了我们的分析解决实际问题的能力。提高离我们适应实际,实践编程的能力。
参考文献:
[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 = siz






