北京邮电大学信息与通信工程学院第1页程序设计实践设计报告课题名称:基于MFC简单绘图的设计与实现学生姓名:_____________________班级:_________________班内序号:________________________学号:_________________日期:_________2014.5.17___________北京邮电大学信息与通信工程学院第2页1.课题概述1.1课题目标和主要内容简述本课题实现的主要内容和目标:简单绘图软件的设计和实现使用的开发平台:MFC开发平台采用的主要工具:visualstudio2013.1.2系统的主要功能功能说明图形使用户能够绘制点、直线、曲线、椭圆、矩形线型使用户能够绘制实线、虚线、点线线宽使用户能够选择所需要的线宽填充使用户能够在矩形、椭圆内填充希望的颜色边框使用户能够选择矩形、椭圆边线、点、直线、曲线的颜色清空画布清空所有用户绘制内容2.系统设计2.1系统总体框架北京邮电大学信息与通信工程学院第3页2.2系统详细设计[1]模块划分图及描述a.画图模块:该模块的大部份功能都写在了CDrawSomethingView类里面。该模块也是此次程序的重点模块之一,主要负责画一些简单图形,例如:直线、矩形、椭圆、任意曲线等等;有线型、线宽的设置;还有画笔颜色和填充色的选择,可以画各种各样颜色的线条。b.窗口模块:这部分大多数都是编译器自动生成,只做了一些修改,例如:使程序一开始运行便最大化。c.菜单模块:该部分同样大部分都是编译器自动生成的,自己增添了一部分菜单例如:绘图工具、颜色设置、线条设置等等,让使用者可以进行快速的操作。[2]类关系图及描述a.CAboutDlg类由编译器生成。b.CDrawSomethingView类由编译器自动生成的类表1CDrawView类说明表名称属性说明m_flag数据成员用于选择图形的类型(直线,矩形,椭圆等)m_ptOld数据成员画图的临时点(也是绘图结束的终点)m_ptOrigin数据成员画图的起点m_color数据成员画笔颜色选择m_vLineWidth数据成员指向线宽的指针m_vLineStyle数据成员线型选择(点线,实线,虚线)OnEditColor()成员函数颜色选择北京邮电大学信息与通信工程学院第4页OnLine()成员函数画直线OnRectangle()成员函数画矩形OnEllipse()成员函数画椭圆OnLButtonDown()成员函数鼠标按下响应函数OnLButtonUp()成员函数鼠标弹起响应函数OnMouseMove()成员函数鼠标移动响应函数[3]程序流程图及描述程序运行选择画图类型调用OnMouseMove()在屏幕显示所画线条调用OnLButtonUp()再画一次鼠标左键弹起画图结束调用OnLButtonDown(),保存起点北京邮电大学信息与通信工程学院第5页[4]存储结构、内存分配无2.3关键算法分析变量分析:m_nType:画图类型(必须选择,若未选择便开始画图则弹出“您还没有选择要画的图形”)m_cType:画图以及填充颜色(设置了默认,红,绿,蓝以及自定义,未选择时则缺省默认值(RGB(255,255,255)))m_lType:线型(设置了实线型,虚线型,点型,未选择时则缺省实线型)m_wType:线宽(设置了1,2,3,5,10,12,14,16,18,20,25,30,50,70,72常见线宽以及自定义,未选择时则缺省线宽为1)m_bType:画刷(设置了填充和透明,未选择时则缺省为透明)算法1:函数名voidCDrawSomethingView::OnLButtonUp(UINTnFlags,CPointpoint)[1]算法功能绘制具体图形[2]算法基本思想通过变量m_nType来确定用户需要绘制的图形,进一步通过不同的代码实现图形[3]算法空间、时间复杂度分析[4]代码逻辑voidCDrawSomethingView::OnLButtonUp(UINTnFlags,CPointpoint)//绘图{//TODO:在此添加消息处理程序代码和/或调用默认值m_Mouse=FALSE;if(m_nType==-1){MessageBox(_T(您还没有选择要画的图形));}CClientDCdc(this);CPenPenColor(m_Style,m_Kuan,m_color);CBrushBrushColor(m_Brush);dc.SelectObject(&PenColor);北京邮电大学信息与通信工程学院第6页dc.SelectObject(&BrushColor);CRectrectEllipse(m_ptOrigin,point);intr=(int)sqrt((point.x-m_ptOrigin.x)*(point.x-m_ptOrigin.x)+(point.y-m_ptOrigin.y)*(point.y-m_ptOrigin.y));//定义圆的半径CRectrect(m_ptOrigin.x-r,m_ptOrigin.y-r,m_ptOrigin.x+r,m_ptOrigin.y+r);//定义一个正方形switch(m_nType){case1:if(m_bType==TRUE)//矩形{dc.Rectangle(rectEllipse);}else{dc.SelectStockObject(NULL_BRUSH);dc.Rectangle(rectEllipse);}break;case2:if(m_bType==TRUE){dc.Ellipse(rectEllipse);}else{dc.SelectStockObject(NULL_BRUSH);dc.Ellipse(rectEllipse);}//椭圆break;case3:dc.MoveTo(m_ptOrigin);//直线dc.LineTo(point);break;case5:dc.SetPixel(point,m_color);//点}CGraph*pGraph=newCGraph(m_nType,m_ptOrigin,point);GetDocument()-m_obArray.Add(pGraph);CView::OnLButtonUp(nFlags,point);}北京邮电大学信息与通信工程学院第7页算法2:函数名voidCDrawSomethingView::OnMouseMove(UINTnFlags,CPointpoint)[1]算法功能绘制曲线[2]算法基本思想通过连续取得用户鼠标移动中形成的直线段近似成一条曲线[3]算法空间、时间复杂度分析[4]代码逻辑voidCDrawSomethingView::OnMouseMove(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值CClientDCdc(this);if(m_Mouse==TRUE&&m_nType==4){CPenPenColor(m_Style,m_Kuan,m_color);dc.SelectObject(&PenColor);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags,point);}2.4其他无3.程序运行结果分析包括输入数据来源和格式:鼠标轨迹输出显示方式:图形主要界面:绘图界面操作流程:选择图形、线宽、线型、是否填充,按鼠标绘制响应时间:即时运行效果北京邮电大学信息与通信工程学院第8页4.总结4.1课题的难点和关键点关键点之一:椭圆的绘制。由椭圆绘制的实质是在用户鼠标按下和抬起的两坐标点建立矩形,然后利用函数画出矩形的内切椭圆关键点之二:曲线的绘制。曲线的绘制需呀消息响应跟随鼠标移动,在每一时刻的落点都是下一时刻的起点关键点之三:调用全色域对话框。当用户点击相应菜单时调用mfc自带的相应对话框函数和rgb颜色函数并传递至主变量北京邮电大学信息与通信工程学院第9页4.2本课题的评价我的实验程序基本完成了绘图程序的要求。当然也有许多不足。比如说我的程序没法实现正圆的绘制,对于像素更大的点也无法打到会只要求。绘制正圆的绘制需要加上正圆的相应以让程序进行正方形的绘制,进而获得正方形的内切圆。对于像素更大的点,完全可以用小直径的填充正圆实现并且无法,实现窗口最小化和最大化的更新保持,更新以后椭圆会变成以由所获取矩形的对角线为半径的正圆,且其余值全变成默认项。4.3心得体会通过本次实验,我深刻的认识到从自然逻辑思维转换到电脑代码灵活性的重要程度。还应注意代码的规范性,有多个变量时,我们应建立合适的标识符,避免混乱。除此之外,在修改一个函数的时候,我还要考虑大局,因为一点点修改就可能改变其它整个类。5.参考文献[1]《VC++深入详解》——孙鑫2010.8[2]《数据结构与STL》_——徐雅静肖波2010.9