VC++程序设计课程设计报告书
题目: 绘图软件设计
班级:
学号:
姓名:
指导教师:
周期:
成绩:
一、课程设计的目的与要求
(一)课程设计目的与任务
目的:根据自身对visual c++ 的学习,通过此次上机实践,加深对visual c++ 各类控件的知识。充分了解各个控件之间的使用及数据的传递方法,根据所学习的类、变量、函数来完成一项简单的课程设计,实现画图软件的功能
任务:使用visual c++.net完成所选择的课程设计的题目以及题目中所要求实现的相关功能与要求,并且通过本次的课程设计,让自己对visual c++ 有进一步的理
(二)题目要求
单文档应用程序,能够选择图形的类型(圆,矩形,直线,画笔),能够选择图形的颜色,能够对绘制的图形进行颜色填充,能够选择图形的线型(如实线,虚线),能够选择画线的颜色和线的宽度。
二、设计正文
1 、系统分析
对需要用到的变量进行初始化,选择相应的图形之后就响应相应的消息处理函数,赋对应的值。选择不同 的线宽,线色与填充色,鼠标的按下响应函数 OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标 的拖动响函数 OnMouseMove()改变终点的坐标,鼠标的弹起响应 OnLButtonUp(),确定终 点坐标,得到绘制图形。
2、 功能详细描述及框图
3、主要功能逻辑过程
绘制图形: 鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在 OnLButtonDown() 函数里,将捕获的坐标值赋给定义作为起点的变量;按下鼠标左键拖动鼠标时,捕 捉鼠标当前位置坐标值为终点坐标值,此时在 OnMouseMove()函数里,把捕获的坐标值赋 给定义作为终点的变量,绘图代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,此时执行的是 OnLButtonUp()函数
主要算法:
int CMy1109113112View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
pdc=new CClientDC(this);
color=RGB(0,0,0);
tccolor=RGB(255,255,255);
width=1;
style=0;
tcstyle=5;
type=4;
a=false;
tc=false;
return 0;
}
void CMy1109113112View::OnLButtonDown(UINT nFlags, CPoint point)
{
p1=p2=point;
pen.CreatePen(style,width,color);
pdc->SelectObject(&pen);
if(tc)
{
bsh.CreateHatchBrush(6,tccolor);
pdc->SelectObject(&bsh);
}
else
{
pdc->SelectStockObject(NULL_BRUSH);
}
pdc->SetROP2(R2_NOTXORPEN);
a=true;
CView::OnLButtonDown(nFlags, point);
}
void CMy1109113112View::OnLButtonUp(UINT nFlags, CPoint point)
{
pdc->SetROP2(R2_COPYPEN);
if(type==1)
{
pdc->MoveTo(p1.x,p1.y);
pdc->LineTo(point.x,point.y);
}
else if(type==2)
{
pdc->Ellipse(p1.x,p1.y,point.x,point.y);
}
else if(type==3)
{
pdc->Rectangle(p1.x,p1.y,point.x,point.y);
}
else if(type==4)
{
pdc->MoveTo(p1.x,p1.y);
pdc->LineTo(point.x,point.y);
}
a=false;
pen.DeleteObject();
bsh.DeleteObject();
}
void CMy1109113112View::OnMouseMove(UINT nFlags, CPoint point)
{
if(!a)
return;
if(type==1)
{
pdc->MoveTo(p1.x,p1.y);
pdc->LineTo(p2.x,p2.y);
p2=point;
pdc->MoveTo(p1.x,p1.y);
pdc->LineTo(p2.x,p2.y);
}
else if(type==2)
{
pdc->Ellipse(p1.x,p1.y,p2.x,p2.y);
p2=point;
pdc->Ellipse(p1.x,p1.y,p2.x,p2.y);
}
else if(type==3)
{
pdc->Rectangle(p1.x,p1.y,p2.x,p2.y);
p2=point;
pdc->Rectangle(p1.x,p1.y,p2.x,p2.y);
}
else if(type==4)
{
p2=point;
pdc->MoveTo(p1.x,p1.y);
pdc->LineTo(p2.x,p2.y);
p1=point;
}
CMainFrame *pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatus=&pFrame->m_wndStatusBar;
CString str;
if(pStatus)
{
str.Format(_T("X=%d"),point.x);
pStatus->SetPaneText(4,str);
str.Format(_T("Y=%d"),point.y);
pStatus->SetPaneText(pStatus->CommandToIndex(IDS_Y),str);
}
CView::OnMouseMove(nFlags, point);
}
4、界面设计
图一 绘图类型菜单
图二 填充颜色菜单
图三 选择线型菜单
图四 工具栏菜单
图五 画图后界面
5、系统测试
进行非正常操作的模拟时,如鼠标乱点、乱画,绘制大量的图形等,会出现窗口,提示“Debug Asserttion Failled“,应操作慢一点或者在客户区进行。
三、小组成员分工说明
独立完成
四、课程设计总结或结论
1 课程设计过程中出现的技术难点和解决方法:
难的是代码的 添加,对绘制图形的程序有大概的思路,但具体编写时变量的运用以及函数的调用设置。 这次实验中关键就是确定画图起点及终点坐标,因为是用鼠标绘制图形,所以需用函数来 捕获鼠标当前所在位置的坐标,因此我设置了 OnLButtonDown()函数来捕获起点坐标, OnMouseMove()函数来捕获鼠标移动是的当前位置坐标, OnLButtonUp()函数来捕获终点坐 标。
2 课程设计期间的主要收获:
这次课程设计虽只是做了一个极其简单的绘图工具的制作,但也让我从设计者的角度看到了设计程序以及电脑软件工具的实质及难度,看似一个很简单的工具,其制作的背后 工作是很大的,不光是图标,按钮的设置,程序的编写,代码的实现都是很精密且不容许 一点错误的工作。平时我们使用的很顺手的一个小小工具, 其开发的各项小号都不可小觑, 由此,我们需要学的东西还太多太多。
VC程序设计课程设计 报告书
设计题目: 简单绘图软件
院 系: 信息工程学院
班 级:
组 别:
学 号:
姓 名:
起止日期:2012年12月10日~2012年12月20日
指导教师:
目录
绪论... 2
一 概要设计... 4
1.主要功能... 4
2.概要设计功能框架图... 5
二 设计的详细设计... 5
1工具栏的编辑... 5
2 状态栏的编辑... 6
三 编码和测试... 8
1 测试方法及其简介... 8
2 测试用例... 9
3 测试总结... 13
四 设计总结... 13
1.过程分析... 13
2 经验教训及分析... 14
3 程序维护... 14
五 参考文献... 14
随着时代的发展,计算机逐渐普及。飞速发展的计算机技术,使人类社会走进了信息化和自动化时代,并且计算机的各种智能识别功能也随着计算机的发展得到了迅速的发展。计算机以硬件和软件两条主线,相互促进,不断发展。如果说硬件是计算机的躯体,那么软件就是计算机的灵魂,软件的地位举足轻重。特别是图形图像的计算机处理技术更是有了前所未有的进步和应用。计算机识别也逐渐的从图形图像处理的大环境下分离出来作为一门新的高科技研究领域出现。画图涉及到的学科很多,包括数字信号处理、工程数学、信息论、运筹学等,它与计算机、自动化、生物学、视觉心理和生理学、人工智能、智能信息处理等众多领域交叉、综合集成,有广泛的应用。
日常生活、学习中我们经常需要画图,简单的画图我们可以手工画图,但往往还是不能满足需求。因此,借助计算机准确而快速的画图就十分有必要了。好的画图工具能够很好的完成日常生活中的各种画图工作。 学习了Visual C++编程后设计开发一个简单的画图软件是对Visual C++编程学习的巩固,知识的掌握以及提高。能够在实践中更深的理解面向对象语言,同时提高了解决问题的能力。
该软件功能与Windows下附件中的画图软件有相似功能。本程序是在Visual C++6.0平台上用MFC所编。VC++6.0 是 Microsoft 公司推出的一个基于 Windows 系统平台、可视化的 集成开发环境,它的源程序按 C++语言的要求编写,并加入了微软提供的功能 强大的 MFC(Microsoft Foundation Class)类库。MFC 中封装了大部分 Windows API 函数和 Windows 控件,它包含的功能涉及到整个 Windows 操作系统。MFC 不仅给用户提供了 Windows 图形环境下应用程序的框架, 而且还提供了创建应 用程序的组件,这样,开发人员不必从头设计创建和管理一个标准 Windows 应 用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另 外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用 VC++提供的高度可视化的应用程序开发工具和MFC 类库, 可使应用程序开发变 得简单。
MFC(Microsoft Foundation Classes) , 是 一 个 微 软 公 司 提 供 的 类 库 ( class libraries) 以 C++类的形式封装了 Windows 的 API, , 它包含了窗口等许多类的定义。 各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作 量。其中包含的类包含大量 Windows 句柄封装类和很多 Windows 的内建控件和组 件的封装类。 MFC 6.0 版本封装了大约 200 个类,其中的一些可以被用户直接使用。例如 CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等; CsplitterWnd 类是从 CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户 可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具栏等。 MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_” , 接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。
绘制方面的功能主要包括绘制各种图形,包括直线、矩形、椭圆、扇形、连续线,用笔或画刷自由绘图。绘图时可以选择各种颜色,各种线宽。软件支持保存图形。 该软件设计的设计思想是面向对象程序设计的思想。 面向对象技术是一个非常实用而强有力的软件开发方法。它具有许多特色。一是方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。二是从生存期的一个阶段到下一个阶段的高度连续性,即在一个阶段所用到的部分与在下一个阶段所使用的部分是衔接的,所使用的技术经过生存期每一阶段后不改变。三是把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。 该软件是Windows下附件中的画图软件的辅助工具。它可以帮我们完成绘制一些简单的图形, 由于笔者所学知识有限,在绘图功能上有许多方面不能满足用户需求。希望读者提出宝贵的意见和建议。
1.主要功能 :
(1) 刷新:通过Invalidate()函数实现。
(2) 时钟:通过OnTimer()函数实现。
(3) 显示鼠标当前位置,通过OnDraw()函数实现。
(4) 可以打开文件。
(5) 可以保存图形。
图1 功能框架结构图
上图用层次图描述了我们这个软件中我完成的功能,主要包括两个大的方面,即工具栏和状态栏。又将其分为五个小部分:保存,打开,刷新,显示时间,显示当前光标所在位置。
(1) 首先利用MFC AppWizard[exe]向导创建SDI应用程序test。然后在工作区的ResourceView页面选择ToolBar并展开,双击下面的IDR_MAINFRAME项弹出工具栏资源编辑器显示应用程序向导所创建的菜单资源。
(2) 为工具栏添加工具按钮。在工具栏编辑器中编辑工具栏按钮图形
(3) 给工具栏中添加“保存”,“打开”,“刷新”。其ID分别是ID_FILE_OPEN,ID_FILE_SAVE,ID_DRAW_CLEAR;
(4) 结束后,运行程序,如图所示。工具栏添加3个按钮。并且三个按钮均为灰色,处于不可用状态。想要使得工具栏中的新按钮处于可使用状态,就必须为这些按钮添加消息处理函数。
(5)为保存按钮添加函数响应消息。
(6)为打开按纽添加消息映射函数。
(7)为刷新按钮添加消息映射函数。
(1) 在项目工作去窗口中打开FileView选项卡并展开其选项,在展开的选项中双击Source Files,再展开的目录中双击MainFrm.cpp选项,光标移动到编辑区,找到indicators数组,输入代码:
IDS_TIMER,
IDS_POINTX,
IDS_POINTY,
(2)在项目工作去窗口中选择ResourceView选项,在展开的选项中双击String Table选项。
(3)双击字符串表,单击编辑区下端空白虚框区,按New String键,打开其属性框。
(4)在ID下来列表框中分别选择 IDS_TIMER, IDS_POINTX,IDS_POINTY,
(5)运行程序后,状态栏添加了时钟,及表示位置的坐标x,y.,如图2所示:
图2 添加位置坐标
(5)坐标在视图不停地移动,要在状态栏中显示光标位置就必须先获取光标的当前位置,故需要在视图类中添加获取当前位置的消息函数OnMouseMove()。其具体代码如下:
void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(nFlags==MK_LBUTTON)
{
CClientDC dc(this);
oldpen=dc.SelectObject(previewpen);
dc.SetROP2(R2_XORPEN);
dc.MoveTo(p0);
dc.LineTo(p1);
p1=point;
dc.MoveTo(p0);
dc.LineTo(p1);
dc.SelectObject(oldpen);
}
CView::OnMouseMove(nFlags, point);
}
(6)状态栏中的时钟格需要显示当前时间,但由于时间在每时每刻不断地变化,所以我们需要添加消息函数来帮助我们获得当前系统时间以便状态栏能准确的更新时间。故而我们在框架窗口类中的OnTimer()函数中填写如下代码来实现获取时间这一功能,具体代码如下:
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime time=CTime::GetCurrentTime();
CString str=time.Format("%H:%M:%S");
CClientDC dc(this);
CSize sz=dc.GetTextExtent(str);
m_wndStatusBar.SetPaneInfo(3,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(3,str);
// m_progress.StepIt();
CFrameWnd::OnTimer(nIDEvent);
}
(7)状态栏中要显示时间格就需要一个定时器来显示时间,所以我们需要在框架窗口类中的OnCreate()函数添加一个设置定时器的代码,以助于我们在状态栏显示时间,添加如下代码:
SetTimer(1,1000,NULL);//设置定时器
CTime t=CTime::GetCurrentTime();
CString str=t.Format("%H:%M:%S");
CClientDC dc(this);
CSize sz=dc.GetTextExtent(str);
int index=0;
index=m_wndStatusBar.CommandToIndex(IDS_TIMER);
m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(index,str);
m_wndStatusBar.SetPaneInfo(1,IDS_POINTX,SBPS_NORMAL,40);//设置面板宽度
m_wndStatusBar.SetPaneInfo(2,IDS_POINTY,SBPS_NORMAL,50);
软件工程中对软件测试有两种方法,即黑盒测试和白盒测试。其中白盒测试是一种为按软件的逻辑结构来进行测试的方法,而黑盒测试黑是一种按照程序功能接口测试的方法,该软件我们选用黑盒测试,按照该软件功能设置测试用例进行测试。
编译,运行后,在窗口中进行如下操作:
测试1 :在工具栏选择颜色板中绿色,在菜单栏显示图形中选中圆形,线宽为1像素,然后再工具栏中选择颜色红色,用鼠标在视图区任意拖拽,停止后,再选蓝色,也在其中任意拖拽,完毕后,视图区中显示如图3所示图形
图3测试一
测试2 在工具栏选择颜色板中蓝色,在菜单栏显示图形中选中矩形,线宽为2像素,按下鼠标左键不放开,一直拖拽,形成轨迹后释放,然后再工具栏中选择颜色紫色,用鼠标在视图区任意拖拽,停止后,再选绿色,也在其中拖拽,
完毕后,视图区显示如图4所示:
图4 测试二
测试 3 在工具栏选择颜色板中黄色,在菜单栏显示图形中选中矩形,线宽中选择4像素线宽,工具栏颜色板中选黄色,点击填充,完毕后,视图区中显示如图5所示图形
图5测试三
测试4 在窗口中,按下鼠标左键,一直拖拽,得到窗口显示如图6(a)所示,在工具栏中按下刷新按钮,窗口中视图区全部清除,如图6(b)所示:
图5(a) 测试4
图5(b) 测试4
测试5 在菜单栏显示图形中选择圆形,按下保存按钮打开保存界面选择保存位置,点击确定。这样可以测试保存功能,按下保存按钮显示如图6所示:
图6 测试5
测试6 在工具栏按下打开按钮,会根据选择打开你选定的图片文件,按下打开按钮出现如图7所示界面,然后进行选择打开。
图7 测试6
程序中保存,打开按钮还不太完善,此次测试对功能进行了验证,视图区能根据按钮显示需要,状态栏能够根据光标的移动及系统时间的变化及时做出准确的更新.
通过这次课程设计实践我真的是学到了不少东西! 这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程的风格也很重要。MFC程序设计是一门重要的专业基础课程,是数据结构,操作系统,数据库原理和软件工程等后继课程的基础。适用于大型系统软件和应用软件的开发。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.经过这两个星期的上机实践学习,使我对MFC有了更进一步的认识和了解。在不长的时间里我明白了,不仅仅是要重视,而且要通过不断的上机操作才能更好地学习这门语言。在课程设计这两个星期里,我认识到我有很多不足得地方。首先是自己在指法上还不行,经常按错字母,但通过学习和练习,已经有了很大的提高;再有对MFC的一些标准库函数不太了解,对函数调用的正确使用不够熟悉,还有对MFC中经常出现的错误也不了解。通过设计实践,使我在这几个方面的认识有所提高。经过设计的各个环节,从中学到了很多,锻炼了自己系统的设计的能力,从系统的需求到系统的功能,到系统的测试,到系统的发布,可以掌握到一个完全的过程,这样对我们以后在工作中或学习中得到很好的锻炼,为用VC++编辑软件奠定基础。当然,本报告所采取的解决问题的方法并不是非常完善的,在今后的学习、工作中,将继续研究并改进。
对于MFC程序模块的不熟悉是课程设计中所遇到的大的问题。 MFC中有基于基本对话框,单文档,多重文档等模块,对一些模块的偏向导致对于所有的模块都是似懂非懂,并且在编写程序的时候相互混淆导致编写错误。 程序基础的不扎实是课程设计不能完美,高效的完成的最大影响。 以前对程序只是看在眼里,动手的时间并不多,这次程序设计对自己的程序设计实践能力发出了巨大的挑战,通过对程序的设计发现在自己以前的基础功不扎实,导致许多代码都打错,大小写不分。自己对MFC程序中的各种函数以及各个函数之间的相互调用还不能很好的掌握,不知道程序接口的函数以及参数值,只能查询资料慢慢理解。
该软件在菜单栏中实现了画圆,直线,矩形,并可以对其线宽(1,2,3,4,像素)进行改变。在状态栏中实现时间,坐标,及选择图形,即显示当前时间,光标所在位置,客户区显示图形名称。工具栏中实现颜色,填充,打开文件,保存,刷新。然而该软件同时存在不足,例如显示图形过单一,图形不能同时显示。这些问题还需要在后期进行完善。
【1】 詹红霞 侯思颖 陶永红等编著 Visual c++程序设计教程 清华大学出版社
【2】 王育坚编著 Visual c++面向对象编程教程第二版 清华大学出版社
【3】 启明工作室编著 Visual c++ + SQL Server数据库应用实例完全 解析 人民邮电出版社
编号字号软件课程设计报告班级姓名学号指导老师中国矿业大学计算机科学与技术学院年月1软件课程设计任务书专业年级计算机科学与技术计科1…
华中科技大学电子科学与技术系课程设计报告(20--xx年度第学期)名称:软件课程设计题目:院系:班级:学号:学生姓名:指导教师:设…
软件工程课程设计报告海天一色网上书店软件工程课程设计个人报告题目网上书店学院名称信息科学与工程学院专业班级计算机092班报告人姓名…
软件课程设计实验报告个人报告课班成员学一需求分析1引言32预期功能33设计目标4二界面方案设计说明1拟选用的开发平台和工具介绍42…
软件开发课程设计报告题目职工信息管理系统设计院系专业班级学生姓名学号指导教师2013年9月2日至2013年9月15华中科技大学武昌…
河海大学计算机及信息工程学院常州MFC课程设计报告题目聊天室程序设计学号20xx2325专业计算机科学与技术授课班号243002学…
计算机程序设计VC课程设计指导书江苏科技大学南徐学院20xx年2月一课程设计教学目的和任务计算机程序设计VC课程设计是实践性教学环…
通信与信息工程学院20xx20xx学年第2学期课程设计实验报告模块名称VC软件设计专业电子信息工程学生班级B090110学生学号学…
VC课程设计报告一设计时间20xx年12月27日12月31日二设计地点三设计目的VC程序设计是计算机科学与技术专业的必修专业基础课…
班级学号姓名课程设计报告文档题目俄罗斯方块游戏一引言1编写目的通过本课程设计使学生巩固面向对象程序设计的基本概念原理和技术学会使用…
VC课程设计题目一计算器学院XXXXXXX班级XXXXXXX学号XXXXXXX姓名XXXXXXX设计时间XXXXXXX目录1需求分…