文本编辑器课程设计报告.docx
《文本编辑器课程设计报告.docx》由会员分享,可在线阅读,更多相关《文本编辑器课程设计报告.docx(32页珍藏版)》请在冰豆网上搜索。
文本编辑器课程设计报告
学号:
************
******
班级:
1140301
专业:
计算机应用技术
课程名称:
课程设计
课程老师:
王强
2013.1.7
一、问题描述-------------------------------------------------------------------------2
1、基本要求----------------------------------------------------------------------2
2、提高要求----------------------------------------------------------------------2
二、需求分析-------------------------------------------------------------------------2
三、概要设计-------------------------------------------------------------------------3
四、详细设计-------------------------------------------------------------------------5
1、文件操作----------------------------------------------------------------------5
2、编辑操作----------------------------------------------------------------------10
3、工具操作----------------------------------------------------------------------19
4、关于操作----------------------------------------------------------------------20
五、编码与调试分析----------------------------------------------------------------20
六、使用说明-------------------------------------------------------------------------22
七、测试结果-------------------------------------------------------------------------22
八、自学知识-------------------------------------------------------------------------26
九、课程设计心得体会-------------------------------------------------------------27
一、问题的描述
设计并编写一个小型文本编辑器,使其具有通常文本编辑器(如Vi、Edlin)应具备的基本功能。
1.基本要求:
编辑器应具备对文本文件的打开、保存、新建、查找、插人、删除、修改、字符串替换、统计字数,统计行数等功能,对于超过一屏的长文件,应能够分页显示。
设计用户接口命令,实现对文本的编辑。
2.提高要求:
可以支持“*”、“?
”等通配符,支持复制、粘贴等功能,支持多文档同时编辑。
设计用户接口命令,实现对文本的编辑。
二、需求分析
文本编辑器的基本功能:
该文本编辑器是用windows编写的一个程序,运行后弹出文本编辑器的主界面,由键盘输入或以打开的方式输入或显示文本文件内容。
其中程序的编辑项可对当前的文本进行撤销、删除、剪切、复制、粘贴、在文本里显示当前时间、全选、清除、查找、替换、统计等功能。
程序的文件项可以对电脑上txt,c++等格式文件的打开、对当前文本的保存和另存、对当前文本的的新建以及退出文本编辑系统。
程序的工具项为背景音乐,为用户提供了优美动听的音乐,仅在用户编辑疲惫乏力的时候尽情的享用。
最后在程序的帮助项有对该小型文本编辑器的关于,用来介绍该程序,还有访问链接XX,访问114网页大全,为用户提供查找资料等功能服务。
输入形式:
①直接在文本编辑框中输入文本内容;
②以打开的方式打开并在文本框中显示电脑的上文本。
输出形式:
对编辑框中尚无文本内容时进行查找、替换、统计等,程序会弹出一个提示尚无文本信息的小对话框,需输入文本后再进行以上操作。
对编辑框中已有文本内容后进行查找、替换、统计操作,程序将弹出与之对应的对话框,根据所弹出的对话框的按键要求进行之后的操作就可以。
保存文件,另存为等功能都异曲同工,撤销、删除、剪切、复制、粘贴、等就直接在主文本编辑框中操作,直接在其显示操作后的文本信息。
测试数据要求:
任意一文本文件。
三、概要设计
(1)抽象数据类型:
直接运用windows中的的窗口类,通过消息响应,调用API函数实现有关对话框的操作功能,以及自己定义一个仅含有成员函数的普通类对文本字符进行查找、替换、统计的辅助操作,对主对话框和副对话框中函数的回调和参数的回显功能。
(2)主程序流程图
(3)模块调用关系:
该文本编辑器函数括:
WINAPIMain_Proc(),WINAPIChange_Proc(),WINAPIFind_Proc(),WINAPITotal_Proc(),Main_OnInitDialog();Change_OnInitDialog();Find_OnInitDialog();Total_OnInitDialog();Main_OnCommand();Change_OnCommand();Find_OnCommand();Total_OnCommand(),Main_OnClose(),Change_Main_OnClose();Find__OnClose();Total_OnClose();Main_OnSize(),TCHAR*temp(),D_change()等函数;其中每个对话框对应一组函数例如主对话框包括WINAPIMain_Proc(),Main_OnInitDialog(),Main_OnCommand(),Main_OnClose()函数,Main_Proc()函数通过消息响应调用Main_OnInitDialog()完成对话框的初始化,通过调用Main_OnCommand()函数完成对对话框中控件以其菜单项的响应,通过调用Main_OnClose()关闭对话框。
其它的如查找,替换等副窗口也一样。
TCHAR*temp(),函数做回调函数用,返回副对话框中已经改变后的主对话框文本框中的文本内容。
D_change()是实现替换功能的函数
其函数调用关系如下:
四、详细设计
〔1〕、文件操作:
1、文件的新建的实现:
intret=MessageBox(NULL,TEXT("是否把更改保存到新建的文本文档"),TEXT("温馨提示"),MB_YESNO|MB_ICONQUESTION);
if(ret==IDYES)//根据选择如果保存
{
OPENFILENAMEofn;//文件对象
charszFile[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);
}
TCHARstr[10000];
TCHARend[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、文件打开的实现:
caseID_MENUITEMOPEN:
//文本的打开
{
OPENFILENAMEofn;
charszFile[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);
}
TCHARline[256];
TCHARend[10000];
memset(line,0,256);
memset(end,0,256);
while(!
feof(fp))
{
fgets(line,sizeof(line),fp);
lstrcat(end,line);
intw=strlen(end);
end[w-1]='\0';
lstrcat(end,"\r\n");
}
SetDlgItemText(hwnd,IDC_RICHEDIT1,end);
fclose(fp);//关闭文件
}
break;
}
break;
3、文件保存的实现:
caseID_MENUITEMSAVE:
//文本的保存
{
OPENFILENAMEofnb;
charbcFile[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格式
TCHARbaoc[100000];//保存的最大容量为100000
GetDlgItemText(hwnd,IDC_RICHEDIT1,baoc,sizeof(baoc));
fputs(baoc,fp);
fclose(fp);
}
}
break;
3、退出文本编辑器的实现:
intret=MessageBox(NULL,TEXT("是否把更改保存到新建的文本文档"),TEXT("温馨提示"),MB_YESNO|MB_ICONQUESTION);
if(ret==IDYES)
{
OPENFILENAMEofn;
charszFile[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);
}
TCHARstr[10000];
TCHARend[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);
〔2〕、编辑操作:
1、剪切的实现:
caseID_MENUITEMCUT:
//剪切
{SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_CUT,0,0);
//传递对话框中的内容首先获取RichEdit中的内容,WM_CUT,传递要进行操作的内容,0,0为两个WPARAM和LPARAM是约定的消息参数类型。
break;
}
2、复制的实现:
caseID_MENUITEMCOPY:
//复制
{SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_COPY,0,0);
//传递对话框中的内容首先获取RichEdit中的内容,WM_COPY,,传递要进行操作的内容,0,0为两个WPARAM和LPARAM是约定的消息参数类型。
break;
}
3、粘贴的实现:
caseID_MENUITEMPASTE:
//粘贴
{SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_PASTE,0,0);
break;
}
4、清除的实现:
caseID_MENUITEMEMPTY:
//清除
{
SetDlgItemText(hwnd,IDC_RICHEDIT1,"");
break;
}
5、撤销的实现:
caseID_MENUITEMUNDO:
//“撤销”菜单
{
SendDlgItemMessage(hwnd,IDC_RICHEDIT1,EM_UNDO,0,0);
break;
}
6、删除的实现:
caseID_MENUITEMDELETE:
//删除
{
SendMessage(GetDlgItem(hwnd,IDC_RICHEDIT1),WM_CLEAR,0,0);
}
break;
7、全选的实现:
caseID_MENUITEMSELECTALL:
//全选
{
SendMessage(GetDlgItem(hwnd,IDC_RICHEDIT1),EM_SETSEL,0,-1);
}
break;
8、系统时间的实现:
VOIDCALLBACKMyTimerFun(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime)
{
SYSTEMTIMEstrLocal;//当前时间
GetLocalTime(&strLocal);
TCHARstr[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、查找功能的实现:
intcount=0;
intLine_count=1;
intRow_count=1;
intnum=0;
intflag=0;
TCHARstr1[256];
TCHARtemp1[5000];
TCHARtemp2[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
{
inti=0;
intj=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-strle