简单画图程序设计(共21页).docx
精选优质文档-倾情为你奉上 面向对象程序设计课程设计报告设计题目: 简单画图程序的设计 学 院: 信息工程学院 专 业: 计算机科学与技术(交通) 学 号: 姓 名: 指导教师: 2015 年 1 月 4 日目录1.设计目的和内容11.1.设计目的11.2.设计内容12.基本功能12.1.图形样式12.2.颜色样式22.3.画笔样式22.4.线型选择33.设计思路34.软件设计54.1.设计步骤54.2.界面设计84.3.关键功能的实现95.心得体会116.参考文献117.附录117.1.调试报告117.2.调试结果127.3.关键源代码12专心-专注-专业1. 设计目的和内容1.1. 设计目的1、 学习Visual C+的MFC开发程序的步骤2、 综合运用所学的类、继承和多态的知识3、 进一步掌握程序调试的方法1.2. 设计内容1、 利用MFC的向导,创建基于单文档的应用程序2、 编程实现,绘制线、圆、矩形的功能3、 能够设定当前要画的图形样式(最少为以上3种)和图形颜色(最少能够设为以下4种颜色:黑、红、绿、蓝)4、 当窗口重绘后,还能保持原来的图形5、 选做1:能够选中某些已绘制的图形,并删除之6、 选做2:能够保存已绘制的图形,下次打开时恢复原状2. 基本功能2.1.图形样式在菜单栏的设置里面有图形样式的选择,可以点击选中也可以在工具栏里点击图形的图标,能够实现绘制点、直线、矩形和椭圆的功能。第 1 页2.2.颜色样式在菜单栏的设置里面有颜色样式的选择,可以点击选中也可以在工具栏里点击颜色的图标,除了能够实现红、绿、蓝、黄、黑的普通选择,同时还加入了一个颜色板,点击更多()可以在调色板上选择任意的颜色。菜单和工具栏选色:调色板选色:2.3.画笔样式在菜单栏的设置里面有画笔样式的选择,可以点击选中即改变画笔的线宽,也可以在工具栏里点击表示画笔宽度的快捷按钮,线宽有从标准、一般、略粗和更粗的选择。第 2 页2.4.线型样式在菜单栏的设置里面有关于线型的选择,可以点击菜单栏的选项也可以在工具栏里找到表示线型的三个按钮,点击即可修改所选的线型。3. 设计思路1、 根据需要用到的变量设定变量并进行初始化2、 选择相应的图形、颜色、画笔、线型之后就响应相应的消息,给需要的变量赋上相应类型的值3、 鼠标按下响应函数OnLBottonDown(),捕捉当前位置得到坐标起点,鼠标弹起响应函数OnLBottonUp()得到另一个坐标则可以进行图形绘制第 3 页4、 选择其他属性即可进行绘制不同颜色、线宽、线型的图形5、 流程图如下:开始 默认(黑色)改变画笔属性选择颜色 默认(空) 改变图形属性 选择图形初始化m_color颜色,m_type图形类型,m_lstyle线型,m_pwidth画笔宽度,m_point起点,point终点。选择笔宽结束结束结束第 4 页 默认(1)改变画笔属性选择线型结束弹起鼠标响应OnLButtonUp()函数,鼠标置于终点,得到图形。按下鼠标响应OnLButtonDown()函数,得到坐标起点,开始绘图。 默认(实线)改变画笔属性4. 软件设计4.1. 设计步骤1、 创建一个MFC AppWizard工程命名为”ZYFdraw”,建立一个单文档,系统会自动生第 5 页成相应的类。第 6 页2、 编辑菜单,在菜单里面增加对应的菜单项并设定对应的ID,需要改变属性只要点击菜单项就可以。3、 在相应的消息函数添加代码,实现功能第 7 页4.2.界面设计在菜单里面增加绘图按钮,包括“图形样式”、“颜色样式”、“画笔样式”和“线型样式”四个子按钮;在工具栏里面添加相应的快捷按钮,更方便于绘图时候的操作。添加菜单栏的项目:菜单项ID菜单项名称菜单项命令响应函数IDM_DDOT点OnDdotIDM_DLINE直线OnDlineIDM_DRECTANGLE矩形OnDrectangleIDM_DELLIPSE椭圆OnDellipseIDM_CRED红色OnCredIDM_CGREEN绿色OnCgreenIDM_CBLUE蓝色OnCblueIDM_CYELLOW黄色OnCyellowIDM_CMORE更多()OnCmoreIDM_CPSLIM标准OnCpslimIDM_CPMIDDLE一般OnCpmiddleIDM_CPBIG略粗OnCpbigIDM_CPMORE更粗OnCpmoreIDM_LSTYLE实线OnLstyleIDM_LSTYLEDASH虚线OnLstyledashIDM_LSTYLEDOT点线OnLstyledot第 8 页添加工具栏的项目:菜单项ID菜单项名称菜单项命令响应函数IDM_SDOT点OnSdotIDM_SLINE直线OnSlineIDM_SRECTANGLE矩形OnSrectangleIDM_SELLIPSE椭圆OnSellipseIDM_SRED红色OnSredIDM_SGREEN绿色OnSgreenIDM_SBLUE蓝色OnSblueIDM_SYELLOW黄色OnSyellowIDM_SPSLIM标准OnSpslimIDM_SPMIDDLE一般OnSpmiddleIDM_SPBIG略粗OnSpbigIDM_SPMORE更粗OnSpmoreIDM_SLSOLID实线OnSlsolidIDM_SLDASH虚线OnSldashIDM_SLDOT点线OnSldot界面如下:4.3.关键功能的实现当鼠标点击菜单栏或者工具栏响应的图形和属性按钮时,即可改变所要画的图形以及画笔的属性。4.3.1.绘图:左键点击工具栏的四个绘图按钮的任意一个可以选择自己需要的图形(点、直线、矩形、椭圆),如下图所示:第 9 页4.3.2.颜色:左键点击工具栏的四个颜色按钮可以选择颜色(红色、绿色、蓝色、黄色)还可以在菜单栏的绘图的颜色样式里面点击更多出现调色板选择更多的颜色,如下图所示: 4.3.3.笔宽:左键点击菜单栏的画笔样式或工具栏以下四个按钮即可改变画笔的宽度,如下图所示:第 10 页4.3.4.线型:左键点击菜单栏的线型样式或在工具栏点击以下三个按钮可以选择实线、虚线和点线的线型,如下图所示: 5. 心得体会这次课程设计我成功的完成了。通过本次的课程设计,我学会了运用鼠标点击完成绘制点、直线、矩形和椭圆的绘图功能。编写一个简单的绘图程序,完成了绘图时图形、颜色、画笔宽度以及线型的选择。基于这次的课设,对菜单界面的建立,消息响应函数处理,创建句柄都比较熟悉了,但是难的地方在于代码的编写。在这次的课设中由于要绘制图形,所以比较关键的是坐标(m_point,point)两个起点和终点的。因此,我设立了消息响应函数OnLButtonDown()以及OnLButtonUp()还获取鼠标的当前坐标和终点坐标。绘制图形也是在OnLButtonUp()的函数里面实现的。为了实现图形的重绘,定义了一个Cdraw的类,在里面重新定义了变量用于保存已绘的图形,其中还是使用了MFC系统自带的一个CPtrArray动态数组。在OnLButtonUp()里面绘制图形,通过自定义的类Cdraw与动态数组CPtrArray在OnDraw()里面实现重绘,这样使得整个程序的结构较为清楚和简便。通过这次的课设让我明白了即使一个小小的绘图程序都是如此复杂,更何况是电脑里面的成千上万的程序呢,自己知道的东西还是太少了,以后要加强学习。6. 参考文献【1】 孙鑫 VC+深入详解(修订版) 电子工业出版社 2012年【2】 梁普选 Visual C+程序设计与实践 清华大学出版 2005年【3】 严华峰 VISUAL C+课程设计案例精编(第二版)中国水利水电出版社 2004年【4】 魏亮、李春葆等 Visual C+程序设计例学与实践 清华大学出版社 2006年 7. 附录7.1. 调试报告开始时没有创建Cdraw类来保存已经绘制的图形,所以每次在绘好图形以后拉动窗口,图形被刷新就消失了。在创建了Cdraw类后我们通过系统自带的动态数组保存已绘的图形,在在OnDraw()里面调用以保存的图形,则在拖动窗口时图形不消失。第 11 页7.2. 调试结果1、 编译运行后的窗口如下:2、 改变绘图的画笔粗细,颜色、形状得到的窗口如下:7.3. 关键源代码1、在CZYFdrawVIEW类的头文件中加入私有成员变量:private:int m_lstyle;int m_pwidth;CPtrArray m_cptArray;第 12 页 COLORREF m_color;CPoint m_point;UINT m_type;2、其中各个成员变量的代码实现如下:void CZYFdrawView:OnDdot() /点/ TODO: Add your command handler code herem_type=1;void CZYFdrawView:OnDline() /直线/ TODO: Add your command handler code herem_type=2;void CZYFdrawView:OnDrectangle() /矩形/ TODO: Add your command handler code herem_type=3;void CZYFdrawView:OnDellipse() /椭圆/ TODO: Add your command handler code herem_type=4;/颜色void CZYFdrawView:OnCred() /红色/ TODO: Add your command handler code herem_color=RGB(255,0,0);第 13 页void CZYFdrawView:OnCgreen() /绿色/ TODO: Add your command handler code herem_color=RGB(0,255,0);void CZYFdrawView:OnCblue() /蓝色/ TODO: Add your command handler code herem_color=RGB(0,0,255);void CZYFdrawView:OnCyellow() /黄色/ TODO: Add your command handler code herem_color=RGB(255,255,0);void CZYFdrawView:OnCmore() /更多/ TODO: Add your command handler code hereCColorDialog dlg;dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;/ 弹出对话框dlg.m_cc.rgbResult=m_color;/记录颜色if(IDOK=dlg.DoModal()m_color=dlg.m_cc.rgbResult;/笔宽void CZYFdrawView:OnCpslim() /标准/ TODO: Add your command handler code herem_pwidth=2;void CZYFdrawView:OnCpmiddle() /中等第 14 页/ TODO: Add your command handler code herem_pwidth=4;void CZYFdrawView:OnCpbig() /粗/ TODO: Add your command handler code herem_pwidth=8;void CZYFdrawView:OnCpmore() /更粗/ TODO: Add your command handler code herem_pwidth=10;/线型void CZYFdrawView:OnLstyle() /实线/ TODO: Add your command handler code herem_lstyle=0;void CZYFdrawView:OnLstyledash() /虚线/ TODO: Add your command handler code herem_lstyle=1;void CZYFdrawView:OnLstyledot() /点线/ TODO: Add your command handler code herem_lstyle=2;3、在OnLButtonDown()中实现记录起点:void CZYFdrawView:OnLButtonDown(UINT nFlags, CPoint point) 第 15 页/ TODO: Add your message handler code here and/or call defaultm_point=point;CView:OnLButtonDown(nFlags, point);4、在OnLButtonUp()中实现绘画图形功能的代码如下:void CZYFdrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this);CPen pen(m_lstyle,m_pwidth,m_color);dc.SelectObject(&pen);/空白画刷 使图形不覆盖CBrush* pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); dc.SelectObject(pBrush);switch(m_type)case 1:dc.SetPixel(point,m_color);break;case 2:dc.MoveTo(m_point);dc.LineTo(point);break;case 3:dc.Rectangle(CRect(m_point,point);break;case 4:dc.Ellipse(CRect(m_point,point);break;dc.SelectObject(pBrush);dc.SelectObject(&pen); Cdraw *pdraw=new Cdraw(m_type,m_color,m_pwidth,m_lstyle,m_point,point);m_cptArray.Add(pdraw);CView:OnLButtonUp(nFlags, point);5、在OnDraw()中实现图形重绘之前要自己重新定义一个新的类”Cdraw”,并在类中保存需要保存的变量代码如下:第 16 页Cdraw类变量全部设为共有类型的:class Cdraw public:int m_lstyle;int m_pwidth;UINT m_type;COLORREF m_color;CPoint m_point;CPoint m_ptEnd;Cdraw();Cdraw(UINT m_type,COLORREF m_color,int m_pwidth,int m_lstyle,CPoint m_point,CPoint m_ptend);virtual Cdraw();private:;Cdraw:Cdraw(UINT m_type,COLORREF m_color,int m_pwidth,int m_lstyle,CPoint m_point,CPoint m_ptEnd)this->m_type=m_type;this->m_color=m_color;this->m_pwidth=m_pwidth;this->m_lstyle=m_lstyle;this->m_point=m_point;this->m_ptEnd=m_ptEnd;6、实现图形重绘:void CZYFdrawView:OnDraw(CDC* pDC)CZYFdrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCBrush* pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);pDC->SelectObject(pBrush);for(int i=0;i<m_cptArray.GetSize();i+)CPen pen(Cdraw*)m_cptArray.GetAt(i)->m_lstyle,(Cdraw*)m_cptArray.GetAt(i)->m_pwidth,(Cdraw*)m_cptArray.GetAt(i)->m_color);第 17 页CPen* pOldPen=pDC->SelectObject(&pen);switch(Cdraw*)m_cptArray.GetAt(i)->m_type)case 1:pDC->SetPixel(Cdraw*)m_cptArray.GetAt(i)->m_ptEnd,(Cdraw*)m_cptArray.GetAt(i)->m_color);break;case 2:pDC->MoveTo(Cdraw*)m_cptArray.GetAt(i)->m_point);pDC->LineTo(Cdraw*)m_cptArray.GetAt(i)->m_ptEnd);break;case 3:pDC->Rectangle(CRect(Cdraw*)m_cptArray.GetAt(i)->m_point,(Cdraw*)m_cptArray.GetAt(i)->m_ptEnd);break;case 4:pDC->Ellipse(CRect(Cdraw*)m_cptArray.GetAt(i)->m_point,(Cdraw*)m_cptArray.GetAt(i)->m_ptEnd);break;pDC->SelectObject(pOldPen);第 18 页