C++课程设计报告简易文本编辑器.docx

上传人:b****5 文档编号:5102061 上传时间:2022-12-13 格式:DOCX 页数:32 大小:165.61KB
下载 相关 举报
C++课程设计报告简易文本编辑器.docx_第1页
第1页 / 共32页
C++课程设计报告简易文本编辑器.docx_第2页
第2页 / 共32页
C++课程设计报告简易文本编辑器.docx_第3页
第3页 / 共32页
C++课程设计报告简易文本编辑器.docx_第4页
第4页 / 共32页
C++课程设计报告简易文本编辑器.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

C++课程设计报告简易文本编辑器.docx

《C++课程设计报告简易文本编辑器.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告简易文本编辑器.docx(32页珍藏版)》请在冰豆网上搜索。

C++课程设计报告简易文本编辑器.docx

C++课程设计报告简易文本编辑器

 

中国矿业大学银川学院

 

面向对象程序设计课程设计报告

(2011/2012学年第二学期)

 

题目名称简单文本编辑器的设计

系部机电动力与信息工程系

专业计算机科学与技术

班级10级计算机

(1)班

学生牛建强

完成时间2011年6月

指导老师石晓山

 

引言

在文本编辑器出现前,人们用打孔机把计算机文字打到穿孔卡片上。

文字存放于一个装着这样的薄卡片的盒子里,可以用读卡器来阅读它。

  第一个文本编辑器是一种行编辑器,它运行在打字机型的终端上,这种编辑器并不具备在窗口和屏幕中显示的功能。

它包含了一些非常短的命令(为了减少打字量)。

其中一个命令能够把文件的指定部分通过打字机打印出来。

编辑光标是想象中的一个插入点,通过特殊命令,可以把它移动到特定内容字符串所在的行。

随后,内容字符串又被扩展成正则表达式。

如果想看到文件的变化,你需要把它打印出来。

相对于穿孔机来说,人们认为这种基于行的文本编辑器具有革命性的进步。

如果没有它,用户就需要把那些处理文本的命令打成专用的卡片,并在编辑文件时使用这些卡片。

  当带有显示屏的计算机终端出现后,基于显示屏的文本编辑器开始流行起来。

最早的全屏编辑器中,有一种叫做O26,它是于1967年为CDC6000系列机器的操作控制台而作的。

另外一个早期的全屏编辑器是vi。

vi诞生于20世纪70年代,至今,它仍是Unix和Linux的标准编辑器。

全屏编辑器对视频终端的销售起到了促进的作用。

文本编辑器在Windows的应用中是一个非常重要的项目,在过去十数年中,微软对windows文本编辑器有多个版本的升级改进,而基于其他的编程环境的文本编辑器也是多如牛毛,今天我们用MFC可视化编译环境做一个简易的文本编辑器。

 

1.课程设计目的和意义

《面向对象程序设计》课程设计是实践性教学环节之一,是《面向对象程序设计》课程的辅助教学课程。

该课程设计要求学生综合运用在《面向对象程序设计》课程中学到的面向对象技术与实际编程相结合,独立完成一项较为完整、并具有一定实际功能的课程设计任务,同时加深学生对面向对象和C++编程技术的理解和掌握,培养实际的应用程序开发能力。

在课程设计过程中,使学生养成良好的程序设计风格,并掌握C++应用程序的设计开发过程和编程方法、测试方法

2.详细设计

2.1需求描述

简单文本编辑器的设计是基于MicrosoftVisualStudio2008开发的一款小型的软件,主要的设计是为了满足普通用户对文本文档进行一般的简单操作,通过MFC可视化编程环境,直接生成一个友好的用户操作界面,通过这个窗口,用户可以对文本进行如下的基本操作。

2.1.1文件

1新建:

创建一篇空白文档,从“工具栏”或“文件下拉菜单”中创建

②打开:

打开文本(.txt)文件,从“工具栏”或“文件下拉菜单”中打开;或将文本(.txt)文件拖入程序界面打开或应用程序图标上打开;或右键单击文本文件,在“打开方式”中选择本程序打开

2保存:

保存文档,从“工具栏”或“文件下拉菜单”中打开

④另存为:

保存文件副本,在不同位置或以不同文件名保存文档,从“工具栏”或“文件下拉菜单”中另存

2.1.2编辑

①撤销:

撤销前一步所进行的操作,从“编辑下拉菜单”或“右键菜单”中撤销

3删除:

删除当前选定字符(串),从“编辑下拉菜单”或“右键菜单”中删除

4剪切:

复制并删除选定字符(串),从“编辑下拉菜单”或“右键菜单”中剪切

5复制:

复制选定字符(串),“编辑下拉菜单”或“右键菜单”中复制

6粘贴:

对粘贴内容进行粘贴,从“编辑下拉菜单”或“右键菜单”中粘贴

7全选:

对文本编辑框中文本全部选定,从“编辑下拉菜单”或“右键菜单”中全

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进行控制的,代码中使用的是图形至于文本输入的下方并设置为透明,在下面的文本编辑区下层有一张写有内容的图片作为装饰,换行等动作惠济路插入符位置并按照坐标进行绘制,文本框的大小改变等会导致文本编辑区的重绘,所以在改变文本框时必须调用函数对文本框中的内容进行保存,相关代码如下所示:

BOOLCBmpEdit:

:

OnEraseBkgnd(CDC*pDC)

{

CDCmemDC;

memDC.CreateCompatibleDC(pDC);//创建内存设备上下文

memDC.SelectObject(&m_Bitmap);//将位图选入设备上下文

BITMAPm_Bmp;//声明位图控件

m_Bitmap.GetBitmap(&m_Bmp);//获得位图信息

intx=m_Bmp.bmWidth;//获取图片宽度

inty=m_Bmp.bmHeight;//获取图片高度

CRectrect;//声明矩形区域对象

GetClientRect(rect);//获取编辑区大小矩形框

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,x,y,SRCCOPY);//伸展铺上图片

memDC.DeleteDC();//释放内存设备上下文

returnTRUE;//returnCEdit:

:

OnEraseBkgnd(pDC);

}

voidCBmpEdit:

:

OnChange()

{

Invalidate();//刷新用户界面

}

HBRUSHCBmpEdit:

:

CtlColor(CDC*pDC,UINTnCtlColor)

{

pDC->SetBkMode(TRANSPARENT);//设置文字背景透明

returnNULL;

}

voidCBmpEdit:

:

OnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)

{

CEdit:

:

OnVScroll(nSBCode,nPos,pScrollBar);//判断滚动条是否滑动

Invalidate();//刷新用户界面

}

voidCBmpEdit:

:

OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)

{

intn1,n2;

n1=GetScrollPos(SB_VERT);

CEdit:

:

OnKeyDown(nChar,nRepCnt,nFlags);

n2=GetScrollPos(SB_VERT);

if(n1!

=n2)//判断滚动条是否滑动

{

Invalidate();//刷新用户界面

}

}

BOOLCBmpEdit:

:

OnMouseWheel(UINTnFlags,shortzDelta,CPointpt)

{

BOOLeditS=CEdit:

:

OnMouseWheel(nFlags,zDelta,pt);

Invalidate();//刷新用户界面

returneditS;

}

2.2.2文件

新建

新建菜单使用的是MFC自带的系统函数中的FILE等函数指令在massagebox的功能实现模块,其中在新建文档的时候需要对文本的编辑区进行判断,对文本框中存在的文本进行存档,而新建的文档就是对文本编辑区进行重绘,对原有的内容进行存储和销毁,详细代码如下所示:

voidCEasyTXTDlg:

:

OnMenuNew()

{//新建前对现有文本的的处理

isModified=m_Edit.GetModify();//获取文本修改标记

CStringstring;

m_Edit.GetWindowText(string);

if(isNew&&string.IsEmpty())//若是新建文本且文本无内容内容

{

;

}

elseif(isModified)//如果文本已被修改,分情况讨论

{

intChoice=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的消息盒子提醒,详细代码如下:

voidCEasyTXTDlg:

:

OnDropFiles(HDROPhDropInfo)

{

char*lpszFileName=newchar[512];

intnFileCount,i;nFileCount=:

:

DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,512);

for(i=0;i

{

UINTnChars=:

:

DragQueryFile(hDropInfo,i,&lpszFileName[0],512);

CStringstr(&lpszFileName[0],nChars);//获得文件路径//打开前对现有文本的的处理

isModified=m_Edit.GetModify();//获取文本修改标记

CStringstring;

m_Edit.GetWindowText(string);

if(isNew&&string.IsEmpty())//若是新建文本且文本无内容内容

{

;

}

elseif(isModified)//如果文本已被修改,分情况讨论

{

intChoice=MessageBox("当前文本已被修改,想保存吗?

","系统提示",

MB_YESNO|MB_ICONQUESTION);//弹出消息对话框询问

if(Choice==IDYES)//选择“是”

{

OnMenuSave();//调用保存函数保存文件

}

}

CStringstrText="";

SavePath=str;

intn=SavePath.ReverseFind('.');

CStringstl=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")

{

CFilefile(str,CFile:

:

modeReadWrite);//以读与写方式打开文件//拖入打开

m_Edit.SetSel(0,-1);//全部选中文本内容

m_Edit.Clear();//将所有文本删除

charread[50000];

file.Read(read,50000);//读取文件内容

for(unsignedi=0;i

{

strText+=read[i];//把文件内容赋值给CString变量

}

file.Close();//关闭文件

m_Edit.SetWindowText(strText);

isNew=FALSE;//标记为打开文本

m_Edit.SetModify(FALSE);//文本修改标记设为修改

}

else

{

MessageBox("不支持的文件类型!

","打开错误");

}

}

:

:

DragFinish(hDropInfo);//释放内存

i=0;

delete[]lpszFileName;

}

voidCEasyTXTDlg:

:

OpenFile()

{

CStringstrCmdLine=GetCommandLine();

inttotalLen=strCmdLine.GetLength();

inti=0;

intindex=0;//循环统计字符个数

for(i=0,index=0;i<3;i++,index++)

{

index=strCmdLine.Find("\"",index);//查找字符串

}

if(index!

=0)

{

for(i=index;i

SavePath+=strCmdLine.GetAt(i);

intn=SavePath.ReverseFind('.');

CStringstl=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")

{

CStringstrText;

CFilefile(SavePath,CFile:

:

modeReadWrite);//以读与写方式打开文件

charread[50000];

file.Read(read,50000);//读取文件内容

for(unsignedi=0;i

{

strText+=read[i];//把文件内容赋值给CString变量

}

file.Close();//关闭文件

m_Edit.SetWindowText(strText);//在编辑框中显示文件内容

m_Edit.SetModify(FALSE);//文本修改标记设为未修改

isNew=FALSE;

Invalidate();

}

else

{

MessageBox("不支持的文件类型!

","打开错误");

m_Edit.SetModify(FALSE);//文本修改标记设为未修改

isNew=TRUE;

}

}

else

{

m_Edit.SetModify(FALSE);//文本修改标记设为未修改

isNew=TRUE;

}

m_Edit.SetSel(0,0);

}

保存

保存使用的是MFC中自带的模块进行的,第一次的保存即为另存为,当文档已经创建以后,文本的保存就改变为把文本编辑区的内容重新写入同一个绝对地址的文本文档中,其中声明和调用的详细代码如下:

voidCEasyTXTDlg:

:

OnMenuSave()

{

if(isNew)//对新建且未保存的文本调用“另存为”进行保存

{

OnMenuSaveas();//新建文本已保存

}

else//对打开的文件修改后进行保存

{

CStringstrText="";

charwrite[50000];

CFilefile(_T(SavePath),CFile:

:

modeCreate|CFile:

:

modeReadWrite);//以读与写方式创建文件

m_Edit.GetWindowText(strText);//获取编辑框中的内容

strcpy(write,strText);//将编辑框中的内容赋值给字符串数组

file.Write(write,strText.GetLength());//把编辑框中的内容写入文件

file.Close();//关闭文件

m_Edit.SetModify(FALSE);//设置修改标记为未修改

}

m_Edit.SetSel(0,0);

}

另存为

另存为是一种特殊的保存形式,另存为在应用的时候是用户用过FILE等函数寻找一个绝对地址并按照现有格式进行保存,在今后的另存为命令中,不会对相同绝对地址相同文件名的文件进行保存,而是在弹出消息对话框用户确认覆盖操作以后才将原有的文件进行删除操作然后把新内容的文件生成在用户选定的绝对地址下,详细代码如下:

voidCEasyTXTDlg:

:

OnMenuSaveas()

{

CFileStatusfs;//文件存在状态

CFileDialogdlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

"AllFiles(*.txt)|*.txt||",AfxGetMainWnd());//构造“文件另存为”对话框

CStringstrPath,strText="";

charwrite[50000];

if(dlg.DoModal()==IDOK)//判断按下“另存为”

{

strPath=dlg.GetPathName();//获取文件另存为路径

if(strPath.Right(4)!

=".txt")

{

strPath+=".txt";//设置文件扩展名为txt

}

if(CFile:

:

GetStatus(_T(strPath),fs))//如果文件存在

{

CStringinfo=strPath;

info+="已存在。

\r\n要替换它吗?

";

intnChoice=MessageBox(info,"另存为",MB_ICONWARNING|MB_YESNO);//弹出确认替换消息

if(nChoice==IDYES)//如果确认替换

{

SavePath=strPath;//获取保存新建文本的路径

CFilefile(_T(strPath),CFile:

:

modeCreate|CFile:

:

modeWrite);//以只写方式创建文件

m_Edit.GetWindowText(strText);//获取编辑框中的内容

strcpy(write,strText);//将编辑框中的内容赋值给字符串数组

file.Write(write,strText.GetLength());//把编辑框中的内容写入文件

file.Close();//关闭文件

isNew=FALSE;

m_Edit.SetModify(FALSE);

}

else//不替换

{

OnMenuSaveas();//弹出另存对话框

}

}

else//如果文件不存在

{

SavePath=strPath;//获取保存新建文本的路径

CFilefile(_T(strPath),CFile:

:

modeCreate|CFile:

:

modeWrite);//以只写方式创建文件

m_Edit.GetWindowText(strText);//获取编辑框中的内容

strcpy(write,strText);//将编辑框中的内容赋值给字符串数组

file.Write(write,strText.GetLength());//把编辑框中的内容写入文件

file.Close();

isNew=FALSE;

m_Edit.SetModify(FALSE);

}

}

m_Edit.SetSel(0,0);

CRectrect(15,80,586,686);

InvalidateRect(rect);//刷新用户界面

}

退出

voidCEasyTXTDlg:

:

OnClose()

{

isModified=m_Edit.GetModify();//获取文本修改标记

CStringstring;

m_Edit.GetWindowText(stri

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1