1、软件设计基础-C+课程设计报告 目 录1.课程设计目的32.课程设计任务与要求33.课程设计说明书44.课程设计过程与成果75.程序调试过程156.设计问题的不足和改进方案167.课程设计心得168.参考文献161课程设计目的课程设计目的:软件设计基础-C+课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C+的知识点,又接近工程实际需要。目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C+这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。题目目的:(1)熟悉MF
2、C消息映射机制,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用以及CDC如何与具体的设备发生关联。(2)培养学生综合利用c+语言进行程序设计的能力,掌握类的概念并进一步熟悉面向对象的程序设计思想。(3)培养学生掌握类间调用的方法。2课程设计任务与要求:要求:本次课程设计利用软件设计基础-C+课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。要求:1、对系统进行功能需求分析2、设计合理的数据结构和系统框架3、编程简练,程序功能齐全,
3、能正确运行4、说明书、流程图要清楚5、课题完成后必须按要求提交课程设计报告任务:基本要求:(1)画直线:通过CDC:LineTo()函数实现。(2)画曲线:通过CDC:LineTo()函数实现。(3)画矩形:通过Rectangle()函数实现。(4)利用位图资源填充矩形:通过CBrush类构造函数CBrush(Bitmap*)实现。(5)画扇形:通过CDC:LineTo()函数实现。创新要求:(1)设置透明的刷子(将矩形填充色为透明)。(2)窗口在重绘时不擦出原来的内容:在窗口发生变化时,窗口的内容不消失,程序在窗口尺寸发生变化时,将会发送WM_PAINT消息,这时首先会擦出窗口背景,然后进行
4、重绘操作,这样就把窗口中先前绘制的内容擦除掉了。3课程设计说明书概要设计:主要是模块说明,模块结构图,系统流程图模块说明::在我设计的程序中一共包括了三个模块,分别是:选择画笔模块、绘图模块、退出系统模块。这三个模块仅仅是绘图的三个步骤,具体的涉及到发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应,设备描述表及其封装类CDC的使用以及CDC如何与具体的设备发生关联。可谓环环相扣,紧密联系。模块结构图:实现画图功能 绘图模块退出系统模块选择绘图工具模块详细设计 总体流程图:创建新工程添加菜单资源添加对话框资源添加新类添加消息响应函数添加控件消息响应函数*V
5、iew类内添加1包含语句,包含新类之头文件。2添加变量,在构造函数内初始化。3添加菜单消息响应函数。各功能模块流程图:绘制完成后关闭窗口,结束程序。在窗口中绘制图形。从绘图工具里选择绘图工具,包括:直线,曲线,矩形,扇形,矩形填充。绘图模块选择绘图工具模块退出系统模块4课程设计过程与成果程序源代码,运行结果:(1)新建一个工程。(单文档)(2)添加一个菜单,在这个菜单中添加五个菜单项。菜单名字叫绘图工具,这五个菜单项分别是:直线,曲线,矩形,扇形,矩形填充。(3)在View中对这五个菜单项添加命令响应。(4)编辑代码:先添加一个成员变量,保存用户选择。初始化成员变量:CMyView:CMyVi
6、ew() / TODO: add construction code here m_nDrawType=0; /初始化成员变量 *然后对鼠标左键按下,松开和鼠标移动分别进行捕获(增加Windows消息处理器)。为了保存鼠标左键的点,现在增加成员变量。初始化此点:CMyView:CMyView()/ TODO: add construction code here m_nDrawType=0; /初始化成员变量m_point=0;新建一个位图:再增加一个成员变量:编辑代码:void CMyView:OnLButtonDown(UINT nFlags, CPoint point) /捕获鼠标按下去
7、的命令响应/ TODO: Add your message handler code here and/or call defaultCClientDC dc(this);switch(m_nDrawType) case 1:m_point=point; /保存鼠标按下去的命令响应到成员变量中 break;case 2:m_point=point;/保存鼠标按下去的命令响应到成员变量中m_decide=0;m_point=point; break;case 3:m_point=point;/保存鼠标按下去的命令响应到成员变量中 break;case 4:m_point=point;/保存鼠标按
8、下去的命令响应到成员变量中m_decide=1; m_point=point; break;case 5:m_point=point;/保存鼠标按下去的命令响应到成员变量中 break; case 6:m_point=point; break;CView:OnLButtonDown(nFlags, point);void CMyView:OnLButtonUp(UINT nFlags, CPoint point) /捕获鼠标松开的命令响应/ TODO: Add your message handler code here and/or call defaultCClientDC dc(this
9、);CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);dc.SelectObject(pBrush); /设置透明的刷子(将矩形填充色为透明)switch(m_nDrawType) case 1: /画直线dc.MoveTo(m_point); /原点dc.LineTo(point); /画线到终点 break;case 2: /画曲线m_decide=3; break;case 3: /画矩形dc.Rectangle(CRect(m_point,point); /传递对象,用Rectangle函数画矩形 br
10、eak;case 4: /画扇形m_decide=3; break;case 6: break;case 5: /矩形位图填充CBitmap bitmap; /定义一位图对象bitmap.LoadBitmap(IDB_BITMAP1); /加载一幅位图CBrush brush(&bitmap); /创建一个画刷对象 /创建客户区内绘图之设备描述环境(设备上下文)对象dc.FillRect(CRect(m_point,point),&brush); /用位图填充 break;CView:OnLButtonUp(nFlags, point);void CMyView:OnMouseMove(UIN
11、T nFlags, CPoint point) /捕获鼠标移动的命令响应/ TODO: Add your message handler code here and/or call defaultCClientDC dc(this); /创建客户区内绘图之设备描述环境(设备上下文)对象if(m_decide=0) dc.MoveTo(m_point); dc.LineTo(point); m_point=point;if(m_decide=1) dc.MoveTo(m_point); dc.LineTo (point);CView:OnMouseMove(nFlags, point);代码编辑
12、完成,接下来就可以运行此程序了。运行结果:该运行结果就画出了直线,曲线,矩形,扇形和矩形填充。5.程序调试过程写出程序调试步骤,及遇到的问题。调试过程中,耗时最多的就是曲线和椭圆不分,刚开始的代码是增加一个m_Oldpoint,代码是:扇形:CClientDC dc(this); if(m_draw=TRUE) dc.MoveTo(m_ptOrigin); dc.LineTo (point); 曲线 :if(nFlags=MK_LBUTTON) /判断鼠标左键是否按下,如果按下,则移动时画线 CClientDC aDC(this); aDC.MoveTo(m_point); aDC.LineT
13、o(point); m_point=point; /将画线的起点移动到鼠标移动后的点后来经过不断调试,分别在CView:OnLButtonDown(nFlags, point)和void CMyView:OnLButtonUp中用了Swich case 语句,将五个菜单项别于鼠标左键按下,松开和鼠标移动进行命令响应。且又增加了一个成员变量m_decide。调试之后代码精简如下:if(m_decide=0) /扇形 dc.MoveTo(m_point); dc.LineTo(point); m_point=point;if(m_decide=1) /曲线 dc.MoveTo(m_point);
14、dc.LineTo (point); 之后的程序才能顺利运行出来。重要的就是函数之间的调用,如设置透明的刷子(将矩形填充色为透明)时:CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);dc.SelectObject(pBrush);函数间调用很复杂,涉及到强行转换。在本次的程序设计中,我错误的建立了一个成员变量却不知道该怎样删除,也就是源代码中的case 6,还有就是最后运行结果出来是时候,将窗口最大化的时候,窗口中的内容就会消失,无法保存,也就是创新要求之中窗口在重绘时不擦出原来的内容:在窗口发生变化时,窗口
15、的内容会消失。再就是任务书之中的曲线不知道是自由线还是特定的函数曲线,我则只是按照自由曲线做的。6.设计问题的不足和改进方案1.最后运行结果出来是时候,将窗口最大化的时候,窗口中的内容就会消失,无法保存,也就是创新要求之中窗口在重绘时不擦出原来的内容:在窗口发生变化时,窗口中的内容会消失。2.任务书中的曲线不知道是特定函数曲线还是自由线,所以最好应该都做出来的,而我只做了自由线当做曲线。3.在编程中错误增加的成员变量需要删除,以精简程序。4.我需要在课下自学创新要求部分,使程序完美化。7.课程设计心得:在此次程序设计过程中,我明白了人就是逼出来的,随着时间的推进,你的能耐被逼的越来越大。在接到
16、题目时,我先是对画图功能很感兴趣,之后知道涉及到没学过的MFC才发现很难,无从下手。后来被逼的查资料,到网上学习,渐渐地对MFC有了一定的觉悟。这时才发现C+不只是大串的代码,还有工程,还有好多我未知的更加丰富的内容。程序的完成+主要集中在十六周,经过整整三个下午和两个晚上的纠结,摸索,尝试,终于弄出来一份能实现画图的程序,顿时觉得仿佛干成了一件很厉害的事情,回过头一想,觉得有点不可思议。除此之外,通过编这个程序,我更多的了解到函数之间的调用,了解了MFC消息映射机制,理解了发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握了设备描述表及其封装类CDC的使用以及CDC如何与具体的设备发生关联。8.参考文献参考书籍:1.郝志恒Visual C+ 编程篇.北京:电子工业出版社.2004.12.李于剑.Visual C+ 实践与提高 图形图像编程篇.北京:中国铁道出版社.2001.13.木林森.Visual C+6.0 使用于开发.北京.清华大学出版社.1998.124.断兴.Visual C+ 实用程序100例.北京:人民邮电出版社.2002.35.许志华.Visual C+ 时尚编程百例.北京:机械工业出版社.2001.1参考网站:17