面向对象程序设计课程设计报告设计题目:简单画图程序的设计学院:信息工程学院专业:计算机科学与技术(交通)学号:201224020326姓名:房战锋同组同学学号:201224020325指导教师:张少博2013 年12 月24 日目录第一章:设计目的及内容 (2)1.1【设计目的】 (2)1.2【设计内容】 (2)第二章:基本功能概述 (3)2.1【工程的新建】 (3)2.2【单文档简介】 (4)2.3【添加消息响应函数】 (5)2.4【资源】 (5)2.5【设备环境】 (6)第三章:设计思路 (6)第四章:软件设计 (7)4.1【设计步骤及关键代码】 (7)4.1.1【点、直线、矩形、椭圆的绘制】 (9)4.1.2【连续线及扇形的绘制】 (11)4.1.3【画刷】 (12)4.2【设置对话框】 (14)4.3【颜色】 (14)4.4【打开与保存】 (15)第五章:结论与心得体会 (16)参考文献: (17)附录: (18)【调试报告】 (18)【测试结果】 (18)【关键代码】 (18)第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【工程的新建】打开Microsoft Visual C++ 6.0 —> 点击File —> New 在Projects中选择MFC AppWizard (exe) ;在Project name中输入工程的名字Graphic,在Location中选择工程存放的路径。
填完后点击OK按钮。
(如图1)填完后点击OK按钮,弹出对话框(如图2)。
在弹出来的对话框中我们可以选择生成三种不同类型的应用程序:单文档、多文档、对话框。
单文档程序如记事本,在一个应用程序中只能对一个文档进行操作,降低了编程的复杂度并减少了运行程序时所需的资源。
对某些小型应用(比如文本编辑器或小型图像编辑器)可以采用这种类型的窗口应用程序。
在这个程序中,我们就需要单文档,选择完后点击Next,设置默认,最后点击Finish 完成工程的创建。
图1图22.2【单文档简介】生成单文档程序后,进行编译,在运行,我们可以看到以下的结果。
如图3图3在ClassView中,我们可以看到系统自动为我们生成了五个类:CApp , CDoc , CView , CAboutDlg , CMainFrame。
如图4图4CApp相当于C语言中的main()函数。
是程序的起始。
CDoc是用于处理程序中文档的类。
CView主要是处理客户区的可视化的操作的类。
CAboutDlg是处理关于对话框的类。
CMainFrame是非客户区的一些资源的类。
我们主要是对CView 类进行操作。
2.3【添加消息响应函数】系统为我们生成了一个程序的框架,但是这个框架完成不了什么具体的功能。
为了使程序程序完成我们想要做的事,我们要向这个框架中加入一些代码。
VC++程序的运行并不像C语言是按照顺序运行下来的。
每当我们完成一个事件,系统就会发出特定的消息,程序就会跳到相应的消息响应函数中执行里面的代码。
单击菜单中的View->Class Wizard(或按快捷键Ctrl+W),将会弹出MFC Class Wizard对话框。
在Class Name中选择CView,在Messages中选择WM_LBUTTONDBLCLK,点击右边的Add Function按键。
这样我们就为程序添加了鼠标左键双击的消息响应函数,函数名为OnLButtonDblClk(UINT nFlags, CPoint point)。
我们点击Edit Code按键就可以进入消息响应函数中。
我们在消息响应函数中添加如下代码:AfxMessageBox(“Hello Word!”); 运行程序!当我们在客户区中双击鼠标左键时,我们可以看到效果(如图5)。
我们在完成双击鼠标左键这个事件后,Windows便会发出WM_LBUTTONDBLCLK这条消息。
我们的程序收到这个消息后,就会跳转到鼠标左键双击的消息响应函数内,执行里面的代码。
同样的,我们可以添加其他的消息响应函数,如鼠标左键按下,抬起,鼠标移动等(WM_LBUTTONUP、WM_LBUTTONDOWN、WM_MOUSEMOVE等)。
我们程序就是在这样的消息响应机制下运行的。
图52.4【资源】在ResoureView 里,我们可以编辑对话框、菜单、工具条、快捷键等资源。
点开Menu,可以看到一个ID为IDR_MAINFRAME的菜单。
ID是一个标识,实际上是一个无符号整型常量,每一个资源在程序中都有一个唯一的ID号。
双击IDR_MAINFRAME,在右边的视图中双击帮助右边的虚线框,弹出菜单属性,在Caption中输入“画图”,并将其关闭。
双击画图菜单下面出现虚线框,在caption中输入“画线”后将其关闭。
双击画线,在弹出的菜单属性中ID栏的ID_MENUITEM32775改成ID_MENUITEM_LINE。
同样方法在建一个“画圆”菜单项。
注意:每个资源对应一个ID号,ID号的命名全部用大写字母,且要符合匈牙利命名法。
我们为新的菜单项起名,如果我们选择了Pop-up,生成的菜单就还有下级子菜单;如果没有选择,菜单就没有下级菜单。
我们同样可以在Class Wizard 中为我们生成的菜单添加响应。
在Class Wizard 中的Object IDs中选中菜单的ID号,Messages中选择COMMOND,然后点击Add Function。
这样,我们就为新建的菜单添加了点击的响应,我们同样可以点击Edit Code 编辑消息响应函数。
2.5【设备环境】CDC是设备环境类的基类直接由CObject派生。
是GDI的关键元素,它代表了物理设备。
每一个C++设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC 句柄来标识。
CDC类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。
使用CDC类可以使我们的作图不用关心设备的问题。
CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。
CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。
CWindowDC 一般应用在框架窗口,而不是视图窗口。
CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。
在每次绘图前,我们要获取设备环境,我们可以使用CDC* GetDC ( ) 函数来获取设备环境。
在绘图完成后,使用void ReleaseDC(CDC* pDC ) 函数释放设备环境。
第3章:设计思路我们的设计思路是编辑菜单项,下图是关于菜单的结构图,写出对应的菜单项相应函数,当在菜单选项中选择某项时,会执行相应的代码,再就是在视图类中添加消息,并添加消息响应函数,发出哪个消息时,会执行相应的消息响应函数,最终显示在屏幕上。
第4章:软件设计4.1【设计步骤及关键代码】首先,新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic 。
为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。
当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。
添加的六个菜单项的ID 及名称如表1所示。
然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。
简易画图板文件绘图笔刷打开保存点直线 矩形椭圆扇形 连续线设置颜色 简单笔刷位图笔刷线宽线型菜单项ID 菜单项名称菜单项命令响应函数IDM_DOT 点OnDotIDM_LINE 直线OnLineIDM-RECTANGLE 矩形OnRectangleIDM_ELLIPSE 椭圆OnEllipseIDM_SHANXING 扇形OnShanxingIDM_LIANXUXIAN 连续线OnLianxuxian表1添加的菜单项在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:private: UINT m_nDrawType:接着,在视类的构造函数中将此变量初始化为0,表明用户还没选择选项,程序代码如下:CGraphicView::CGraphicView(){// TODO: add construction code herem_nDrawType=0;}利用switch/case语句,来分别完成相应图形的绘制。
当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。
程序代码如下:void CGraphicView::OnDot(){// TODO: Add your command handler code herem_nDrawType=1;}void CGraphicView::OnLine(){// TODO: Add your command handler code herem_nDrawType=2;}void CGraphicView::OnRectangle(){// TODO: Add your command handler code herem_nDrawType=3;}void CGraphicView::OnEllipse(){// TODO: Add your command handler code herem_nDrawType=4;}void CGraphicView::OnShanxing(){// TODO: Add your command handler code herem_nDrawType=5;}void CGraphicView::OnLianxuxian(){// TODO: Add your command handler code herem_nDrawType=6;}4.1.1点、直线、矩形、椭圆的绘制对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。