目录1.基本功能描述.............................................................12.设计思路.................................................................13.软件设计.................................................................4设计步骤...............................................................4界面设计...............................................................6关键功能的实现.........................................................74.结论与心得体会...........................................................85.思考题...................................................................86.附录....................................................................10调试报告..............................................................10测试结果..............................................................10关键源代码............................................................10简单画图程序1.基本功能描述简单画图程序实现了常见图形的绘制、图形属性的设置和图形数据的暂存等功能。该程序的具体功能模块包括以下几项:1)图形绘制模块。该模块实现直线段、椭圆、矩形等图形的绘制功能。在鼠标移动的过程中能实时显示当前绘制的图形。2)图形属性设置模块。该模块实现绘图线条的线宽,线色,图形填充色等属性设置功能。3)图形数据暂存模块。该模块实现直线段、椭圆、矩形等图形数据暂存功能,涉及图形的坐标、线宽、线色、填充色等数据。2.设计思路1)对需要用到的变量进行初始化。2)选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。3)鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。4)选择图形或其它属性,可进行下一次绘制。5)程序的流程图如下:开始定义并初始化变shape线色m_ncolor填充色m_fcolor画笔pen画刷brush绘图起点opoint绘图终点cpoint选择线宽改变画笔属性默认值(W=1)选择线色改变画笔属性默认值(黑色)选择填充改变画刷属性默认值(白色)直线矩形椭圆响应函数OnLine()shape=1响应函数OnRect()shape=2响应函数OnEllipse()shape=3鼠标左键按下响应函数OnLButtonDown()opoint=point图1程序流程图3.软件设计设计步骤1)创建单文档创建一个MFCAppWizard[exe]工程,命名为“LiYuJing”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。鼠标移动响应函数OnMouseMove()epoint=point响应OnPaint(),绘制图形鼠标左键弹起响应函数OnLButtonUp()刷新,得到图形结束图2创建工程图3创建单文档图4生成类2)编辑菜单添加需要的菜单项,如图4所示;并在菜单的属性中设定好所对应的ID,如图5所示,各项菜单对应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)。图5添加菜单项图6设置菜单ID表1对应菜单ID菜单名ID菜单名ID直线ID_LINE线宽1ID_W1矩形ID_RECT线宽2ID_W2椭圆ID_ELLIPSE线宽3ID_W3颜色ID_COLOR线宽4ID_W4填充色ID_FILLCOLOR线宽5ID_W5建立类向导,在视图类CLiYuJingView中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图7所示。图7建立类向导3)创建工具栏在插入处选择资源,新建工具栏,如图8所示;图8新建工具栏在工具栏上添加相应的按钮,在属性处更改其ID,如图9所示。图9编辑工具栏4)添加鼠标消息处理函数添加鼠标消息处理函数OnLButtonDown()、OnMouseMove()、OnLButtonUp(),利用橡皮筋技术实时显示绘制图形,并绘制最终图形,具体源代码参看附录。添加过程为:选择View菜单下的ClassWizard菜单项打开类向导,在类列表中选择CLiYuJingView类,在消息列表框中选择WM_LBUTTONDOWN消息并用鼠标左键双击,此时类向导自动在成员函数列表框中添加该消息的处理函数。然后再用同样方法添加WM_MOUSEMOVE消息和WM_LBUTTONUP消息的处理函数,如图10所示。图10添加相应代码界面设计各控件名称,类型,属性以及相关变量如表2所示。表2界面控件表控件名称控件类型属性相关变量绘图下拉式菜单无无直线菜单项工具栏按钮ID_LINEintshape矩形菜单项工具栏按钮ID_RECTintshape椭圆菜单项工具栏按钮ID_ELLIPSEintshape线宽弹出式菜单无intw颜色(线色)菜单项工具栏按钮ID_COLORCOLORREFm_nColor填充色菜单项工具栏按钮ID_FILLCOLORCOLORREFm_fColor整体界面如图11所示。图11整体界面显示关键功能的实现1)选择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为shape分别赋值为1,2,3,在OnPaint()函数里添加3个if语句的代码来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape=2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)改变线宽在OnPaint()创建的画笔中,(PS_SOLID,w,m_nColor),线宽处用w表示,则改变w的值即改变了画笔的粗细。选择菜单绘图→线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。若不选择线宽值,则w=1(即默认线宽值为1)。3)改变线色在OnPaint()创建的画笔中,(PS_SOLID,w,m_nColor),线的颜色处用m_nColor表示,则改变m_nColor即改变了画笔的颜色。选择菜单绘图→颜色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色。4)改变填充色在OnPaint()创建的画刷中,(m_fColor),颜色就是用m_fColor表示的,改变m_fColor即改变了画刷的颜色。选择菜单绘图→填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为白色。5)橡皮筋技术实现鼠标实时绘图利用橡皮筋技术可以实现在鼠标拖拽作图时,实时显示当前绘图的情况。这样,我们就要在鼠标移动的消息处理函数中添加相应的代码。在鼠标左键按下的时候,记录下图元起始点;在鼠标移动的时候,获取鼠标当前位置,绘制出新的图形,同时,将上一次绘制的图形擦除,这就是橡皮筋技术。在OnMouseMove()函数中调用SetROP2()函数将绘图模式设置为NOTXORPEN(同或)模式,使用同或模式绘图就可以画上真实的图形,并擦除上次绘制的图形。在OnLButtonDown()函数中调用SetCapture()函数捕捉鼠标,OnLButtonUp()函数中调用ReleaseCapture()函数释放鼠标。整个绘图过程就是在鼠标左键按下时确定绘图起点,移动鼠标实时显示绘制的图形,鼠标左键弹起即完成图形的绘制的过程。4.结论与心得体会这次课设我成功地完成了设计要求,能用鼠标拖动绘制直线段、椭圆、矩形等基本图形;能控制所绘制图形的线宽、线色、填充色等。经过程序调试,该简单画图程序能够绘制指定线宽、线色、填充色的图形,在鼠标移动的过程中能实时显示当前绘制的图形。在拿到任务书后,我通过查阅资料,不断编程调试,以及请教同学,最终实现绘图程序的要求。我学会了鼠标消息的分类,鼠标消息处理函数的常见编程方法,以及捕捉鼠标SetCapture()函数,释放鼠标ReleaseCapture()函数。同时,利用橡皮筋技术实现鼠标绘图的实时显示是我最大的收获。我在调试程序时,发现绘制直线时鼠标左键弹起直线并没有绘制结束,而再次单击鼠标左键,又以上次绘制的直线段终点作为起点绘制直线,即绘制出的直线段是一段连着一段的。在自己检查数遍并未发现错误之处后,我求助了同学,在OnLButtonDown()函数中添加了一句cpoint=opoint=point0之后问题得以解决。通过这次课程设计,我学到了很多与计算机绘图相关的基础知识,并进一步体会到面向对象的程序设计的强大,以及Windows应用程序用户界面统一、友好,独立于设备的图形操作特点。这次的课程设计虽只是做了一个简单的绘图工具,但是也让我从设计者的角度了解了设计一个程序的过程,看似一个很简单的工具,其制作的背后工作是繁琐的。哪怕是平时我们使用的很顺手的一个小工具,其开发的一切步骤都不可小觑,所以,关于编程还有太多的东西等着我们去了解,学习。5.思考题1)说明直线、椭圆、矩形绘制使用的函数,及其参数含义答:直线、椭圆、矩形绘制使用的函数是OnPaint()。函数里面定义和创建了绘图的画笔pen和填充图形的画刷brush,3种图形本身对应的消息处理函数里分别赋给shape3个不同的值:1,2,3,在OnPaint()里有3个if语句,用来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape=2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。2)如何控制菜单项的状态,使用的消息类型答:通过添加UPDATE_COMMAND_UI消息函数,在生成的函数里添加相关代码来控制菜单项的状态及使用的消息类型。如选择直线时,使shape=1,则OnUpdateLine里添加pCmdUI-SetCheck(shape==1),那么当shape的值为1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。3)如何设置菜单和工具栏按钮的快捷键操作答:切换到资源视图,选择Accelerator资源类型,双击IDR_MAINFRAME加速键资源,打开加速键编辑窗口。在ID下拉列表框中选择相应菜单项的ID,在Key一栏中输入相应键值(比如L),选择Ctrl复选框和VirtKey单选按钮,关闭加速键编辑窗口,即可完成加速键设置,如图12所示。图12快捷键设置6.附录调试报告1)一开始我并没有添加刷新函数Invalidate(),这就使程序运行之后,无论鼠标左键按下时如何移动无法绘图,这是因为当一个窗口内键入内容其实就是将窗口刷新了,