《程序设计课程设计》.docx
《《程序设计课程设计》.docx》由会员分享,可在线阅读,更多相关《《程序设计课程设计》.docx(13页珍藏版)》请在冰豆网上搜索。
《程序设计课程设计》
课程设计报告
课程名称:
程序设计课程设计
课程设计题目:
类似于“记事本”的文本编辑器
姓名:
系:
计算机系
专业:
计算机科学与技术
年级:
学号:
指导教师:
职称:
2011年11月7日
1设计目的………………………………………………………………………3
2设计题目及要求……………………………………………………3
3设计算法分析………………………………………………………………3
3.1模块调用层次图………………………………………………3
3.2核心算法描述………………………………………………………6
3.3系统特点………………………………………………………6
4程序代码………………………………………………………………………6
5调试情况……………………………………………………………………11
6结论……………………………………………………………………………11
参考文献………………………………………………………………12
类似于“记事本”的文本编辑器
1.设计目的
本课程设计的目的就是要通过一次集中的强化训练,使学生能及时巩固已学的知识,补充未学的但又必要的内容。
进行课程设计目的在于加深对程序设计基础中基础理论和基本知识的理解,促进理论与实践的结合,进一步提高程序设计的能力。
具体目的如下:
1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养学生综合运用所学知识独立完成课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
2.设计题目及要求
【1】类似于“记事本”的文本编辑器
设计一个文本编辑器,具有对文本等进行读写等基本操作,类似于Windows中的记事本。
【2】要求
实现如下功能:
(1)能够实现基本的文本文件读取、保存、设置字体等功能。
(2)具有菜单、工具栏和状态栏。
(3)★实现其它相关功能(如字体、剪贴板的操作,查找、打印预览等功能)
(4)★实现多文档界面
3.设计算法分析
3.1模块调用层次图
【1】变量描述
定义形式/名称
含义/作用
结构体
CHOOSECOLOR
CHOOSEFONT
一个是VC类库给出的设置颜色的结构体,另一个是VC类库给出的设置字体的结构体
全局变量
CNotepadApptheApp
用theApp这个全局变量来获取当前应用程序实例的句柄hInstance
文件
头文件:
ChildFrm.h
MainFrm.h
notepad.h
notepadDoc.h
notepadView.h
resource.h
StdAfx.h
源文件:
ChildFrm.cpp
MainFrm.cpp
notepad.cpp
notepadDoc.cpp
notepadView.cpp
StdAfx.cpp
定义了从CMDIChildWnd派生的文档框架窗口对象CTChildFrame
定义了从CMDIFrameWnd派生的框架窗口对象
CMainFrame
定义了从CDocument派生的文档对象CTDoc
定义了从CView派生的视图对象CTView
标准AFX头文件
函数
voidCNotepadView:
:
OnColor()
voidCNotepadView:
:
OnFont()
用来改变字体颜色
用来改变字体大小和格式
【2】系统模块调用层次图
基于面向对象的设计,没有模块调用层次图。
程序的实现过程如下:
设计窗口类
注册窗口类
创建窗口
显示窗口
更新窗口
消息循环
窗口处理函数
首先由全局变量theApp,链接到VC类库中的_tWinMain()函数,找到这个windows框架结构的入口函数后,再依次以上图示意调用各个类,最后产生文本编辑器这个框架程序。
构成应用程序的对象之间的关系:
CWinApp
3.2核心算法描述
3.3系统特点
【1】特点:
一个多文档的界面的类似于“记事本”的文本编辑器。
该编辑器与记事本相比多了改变字体大小、颜色、自体类型的功能,还增加了查找,替换,显示图片,显示时间等功能。
【2】分工:
本程序的编写完全由我个人完成,未和任何人分组。
4.程序代码
【1】程序代码
voidCNoteView:
:
OnFont()
{
//TODO:
Addyourcommandhandlercodehere
CFontDialogdlg;
if(IDOK==dlg.DoModal())
{
memcpy(&lf,dlg.m_cf.lpLogFont,sizeof(LOGFONT));
if(m_font.m_hObject)
m_font.DeleteObject();
m_font.CreateFontIndirect(&lf);
Invalidate();
UpdateWindow();
}
}
voidCNoteView:
:
OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CClientDCdc(this);
dc.SelectObject(&this->m_font);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
elseif(0x08==nChar)
{
COLORREFclr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=nChar;
}
CSizesz=dc.GetTextExtent(m_strLine);
CPointpt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
CView:
:
OnChar(nChar,nRepCnt,nFlags);
}
voidCNoteView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
SetCaretPos(point);
m_strLine.Empty();
m_ptOrigin=point;
CView:
:
OnLButtonDown(nFlags,point);
}
intCNoteView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
Addyourspecializedcreationcodehere
CClientDCdc(this);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
return0;
}//用CView生成的记事本的编写
voidCNoteView:
:
OnFont()
{
//TODO:
Addyourcommandhandlercodehere
CHARFORMATm_charFormat;
GetCharFormatSelection();
CFontDialogdlg(m_charformat,CF_BOTH|CF_NOOEMFONTS);
if(dlg.DoModal()==IDOK)
{
dlg.GetCharFormat(m_charformat);
SetCharFormat(m_charformat);
}
}//在CrichEditView类中用CfontDialog实现字体的变更
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_INDICATOR_CLOCK,//为状态栏增加一个窗格
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
voidCMainFrame:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CTimetime;
time=CTime:
:
GetCurrentTime();//获得系统时间
CStrings=time.Format("%H:
%M");
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s);//更新时间窗格显示的时间
CMDIFrameWnd:
:
OnTimer(nIDEvent);
}
voidCMainFrame:
:
OnClose()
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
KillTimer
(1);
CMDIFrameWnd:
:
OnClose();
}
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
SetTimer(1,1000,NULL);
return0;
}//在CMainFrame:
:
OnCreate中添加
【2】程序执行结果
【3】结果的讨论
结果不是很让人满意,因为始终不能实现根据用户的选择更改字体的愿望,不过能实现基本的字的输入、删除、空格等操作。
5.调试情况
在调试过程中出现的一些问题:
VC提供的类库函数对大小写的要求是十分严格的,所以很容易出现错误,根据编译时提供的错误信息进行修正还是很有帮助的。
成员变量要定义在头文件中,否则在程序还没有生成的时候这个变量会在程序还没有生成之前就被析构了,就不能得到我们预期的效果了。
View类始终是覆盖在框架类之上的,所以我们要捕获鼠标左键点击的操作时要在View中进行,如果在框架类中进行编程,就会造成不必要的麻烦,添加编程的麻烦。
6.结论
这个文本编辑器的代码编写还是相对较简单的,用VC6.0的MFC开发工具,直接就可以生成一个基于windows的框架类程序,不用编写很烦杂的框架程序调用函数,只需了解MFC这个编程工具,学会查询MSDN调用微软提供的类库及各种接口,就会使编写这个记事本程序简单很多。
但是第一次接触MFC,并且MFC庞大的库函数也并不不易理解,在编程过程中也耗费了大量的时间,主要是去学习windows框架程序的内部调用机制,以及VC封装的各种库函数的点用方法。
我用的是C++这个高级程序语言开发工具,通过这次的课程设计,增加了对MFC编程环境的认识,也加深了对c++语言的认识了解,基本能明白windows框架程序内部生成的一个过程以及其内部调用的机制,一定程度上也深一步地认意识到面向对象的思想。
参考文献
1.《C++实用教程》丁有和编著电子工业出版社2009年
2.《C++语言程序设计(第3版)》郑莉董渊张瑞丰编著清华大学出版社2009年
3.《数据结构(C语言版)》严蔚敏吴伟民编著清华大学出版社2010年
4.《软件工程导论(第5版)》张海藩编著清华大学出版社2011年
5.《MFC深入浅出》李久进编著1999年