c++课程设计-交互式绘图软件设计指导书(共34页).doc
《c++课程设计-交互式绘图软件设计指导书(共34页).doc》由会员分享,可在线阅读,更多相关《c++课程设计-交互式绘图软件设计指导书(共34页).doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上C+面向对象程序设计课程设计指导书指导实例:交互式绘图软件设计指导书说明:1.本实例软件经设计实作,为可实际运行的软件。指导书中所列程序代码,均为VC+6.0编程环境中可运行代码复制所得,所列示图,均为制作过程中屏幕截图,其目的是使学习者尽快弄清设计原理,掌握过程、方法,起到举一反三、正真领会面向对象程序设计的思想方法,原理,和操作技能的作用。使用中,“1.设计原理”(第3页),供系统设计分析用,实际操作可从“2.操作过程与步骤”(第6页)开始。2.其余推荐题目,可根据自身实际情况,酌情参考使用。1.设计原理面向对象的程序设计是现在最外流行的程序设计方法。面向对象的方
2、法模仿人们建立现实世界模型的方法,认为客观世界是由各种各样的对象组成的,每个对象都有各自的内部状态和运动规律,不同对象之间的相互作用和联系就构成了各种各样的系统。利用人们对事物分类和抽象的自然倾向,引进了类的概念,具有封装性、继承性和多态性等特点。面向对象的程序设计吸取了传统的结构化程序设计的优点,采用数据抽象和信息隐藏技术、将数据与操作封装在一起,用类来抽象代表现实的实体,用类之间的继承关系来代表设计的抽象过程,将问题求解看作是一个非类演绎过程。1.1 类与数据封装在C+中,类是指由用户定义的一种抽象数据类型,将一组具有相关性的数据成员结合在一起,要使用类中所包含的数据时,必须通过有该类所提
3、供的成员函数来存取。数据封装是指将类中的数据成员以其可被使用或不可被使用的方式进行分类,即有条件地限制类中部分或全部的数据成员被使用,在定义数据成员时在其前面冠以private、protected或public,分别表示私有的、保护的和公有的。因此,类是实现数据封装的一个有力方法,类的特性是实现了数据封装或数据抽象。在本设计中,可以把各种图形形状,如直线、矩形、圆、曲线、多边形等定义为各种各样的图形类,将图的具体绘制、存储操作和属性设置定义为图形类的public成员函数,这样就实现了类与数据封装。例如,直线类可以定义为:class Clineprivate:COLORREF m_color;/
4、直线的颜色int m_lineWidth, m_lineStyle;/直线的线宽和直线的线型POINT m_beginPoint, m_endPoint;/直线的起点和终点public:COLORREF getColor();/返回直线的颜色void setColor(COLORREF color);/设置直线的颜色int getLineStyle();/返回直线的线型void setLingStyle(UINT style);/设置直线的线型int getLineWidth();/返回直线的线宽void setLineWidth(int width);/设置直线的线宽POINT getBeg
5、inPoint();/返回直线的起点POINT getEndPoint();/返回直线的终点void Draw(CDC *pDC);/直线的具体绘制void Serialize(CArchive &ar);;1.2 派生类与继承性在C+中,派生类和继承性是指用户可以利用已有的类(称为基类或父类)定义出新的类(派生类或子类),派生类中不但拥有基类中的全部或部分数据成员与成员函数,而且还可以定义新的数据成员与成员函数。在本设计中,要绘制的图形形状很多,如直线、矩形、圆、曲线、多边形等。虽然图形的形状差别很大,其数据成员和成员函数也有许多不同之处,但是如果从抽象的角度出发,它们有些数据成员和成员函数
6、是相同的,如颜色、线型、线宽属性以及设置或获取这些属性的成员函数,因此可以把这些共同点定义为一个基类CShape,然后从CShape类派生出直线类、矩形类、圆类、曲线类、多边形类等,这样,每个派生类都继承有这些共同点,又可以定义自己独特的数据成员和成员函数,程序结构更加简练合理。CShape类的定义如下:class CShapeprotected:COLORREF m_color;/颜色int m_lineWidth, m_lineStyle;/线宽和线型public:virtual COLORREF getColor();/返回颜色virtual void setColor(COLORREF
7、 color);/设置颜色 virtual int getLineStyle();/返回线型virtual int setLineStyle(int style);/设置线型virtual int getLineWidth();/返回线宽virtual void setLineWidth(int width);/设置线宽virtual void Draw(CDC *pDC);/绘图virtual void Serialize(Carchive &ar);/存储操作;而CLine类派生于CShape类,定义如下:class CLine: public CShapeprivate:POINT m_
8、beginPoint, m_endPoint;/直线的起点和终点public:POINT getBeginPoint();/返回直线的起点POINT getEndPoint();/返回直线的终点void Draw(CDC *pDC);/直线的具体绘制void Serialize(Carchive &ar);/直线的具体存储操作;1.3 虚函数与多态性在面向对象中,多态性是指一个名字有多种含义,或相同界面有多种实现。在继承体系中,如果在派生类中对所继承的成员函数重新定义其功能,该函数应在基类中被定义为虚函数,在成员函数定义时在其前面加上关键字virtual。C+系统能自动判别应该调用哪一个类对象
9、的成员函数。因此,虚函数是一种单界面多实现版本的方法,即函数名、返回类型、参数类型和个数及顺序完全相同,但函数体内容可以完全不同。在本设计中,可以把抽象的图形基类CShape的绘图操作Draw定义为虚函数,直线、矩形、圆、曲线、多边形等作为CShape的派生类,把它们的具体绘图操作定义在各自类中,保留其函数原型(函数名、返回值类型、参数个数及类型、顺序)都不变,然后用指向基类CShape的指针来调用Draw函数,就可以实现虚函数与多态性,即同样的调用语句因指针所指向的对象不同而画出不同的图像。如下所示:CShape *pShape;/定义指向基类CShape的指针pShapeCLine lin
10、e;/定义一个直线类的对象linepShape=&line;/将line的地址赋给pShapepShape-Draw(pDC);/绘制直线Crectangle rect;/定义一个矩形类的对象rectpShape=▭/将CRectangle的地址赋给pShapepShape-Draw(pDC);/绘制矩形CCircle circle ;/定义一个圆对象circlepShape=&circle;/将circle的地址赋给pShapepShape-Draw(pDC);/绘制圆可见,同样的语句“pShape-Draw(pDC);”,却能绘制出不同的图形,这就是虚函数与多态性的功能特点。1.
11、4 数据存储与屏幕重绘绘图程序Draw要求能用鼠标在屏幕上绘制直线、贝济埃曲线、圆、椭圆、矩形、多边形等基本二维图形,并提供相应的文件保存和屏幕重绘功能。二维图形包括许多种类型,用于表征这些二维图形对象的数据是不同的,它们都有颜色、线型和线宽3个属性数据,但它们的几何数据不同,点用一个坐标点数据表示,直线、圆、椭圆和矩形用两个坐标点数据表示,圆角矩形用两个坐标点数据和两个整型数据来表示,圆弧或椭圆弧、饼图或扇形用4个坐标点数据表示,贝济埃曲线用4个以上的坐标点数据表示,而多边形所需的坐标点数据个数是任意的。另外,对于封闭图形,还可以有填充与不填充选择,若填充,还可以选择颜色、影线和图案3种模式
12、之一。因此,如何实现对这些具有不同数据类型和个数图形对象的保存,以及如何根据保存的数据区别不同图形对象并进行屏幕重绘,是本设计要解决的关键问题。从MFC的文档/视图结构可知,应用程序的数据保存专门由文档类的Serialize函数负责具体完成,应用程序的数据显示或屏幕重绘专门由视图类的OnDraw函数负责具体完成。如果在二维图形基类CShape定义中把负责数据保存的成员函数Serialize和负责图形绘制的成员函数Drawing说明为虚函数,在派生类即具体的二维图形类定义中只对Serialize和Drawing的函数内容重新定义,保留其函数名、返回值类型和参数(包括类型和个数)不变,用一个指向基
13、类CShape的指针访问虚函数Serialize和Drawing,就可以实现画图程序具有不同数据类型和个数的二维图形对象的保存,以及根据保存的数据区别不同图形对象在屏幕上重新绘制出来。在MFC类库中,集合类是专门用于数据保存的。集合类又分为数组类、链表类和映射类(也称数据字典类)。它们都能适用于各种数据类型,如BYTE、WORD、int、float、String、对象地址或对象指针等。从前面的分析可以看出,在画图程序中需要保存的数据是各二维图形对象的地址,因此可以选用数组类的CObArray/CPtrArray或链表类的CObList/CPtrList。在MFC中,数组是采用动态数组,链表是采
14、用双向链表。数组和链表对存取数据的操作各有优缺点。在本设计中,可以简单地选用CObArray来存放二维图形对象的地址。1.5 设计思路综上所述,可以总结设计思路如下:首先定义一个二维图形的基类CShape,它包含颜色、线型和线宽3个共有的数据成员,定义串行化Serialize和绘图Drawing两个虚函数,然后从CShape类派生上述各二维图形类:CLine、CCircle、CEllipse、CRectangle、CBezier和CPolygon等,在每一个二维图形类中定义自己的几何数据,定义构造函数以便生产各自的图形对象,重载Serialize和Drawing函数,以实现各自不同的数据序列化
15、和屏幕重绘。其次,在文档类中定义一个可以保存各二维图形对象地址的CObArray数组,并定义3个操作该CObArray数组的文档类成员函数AddShape、GetShape、GetShapeNumber。视图类是使用这些函数的重要用户。在文档类的Serialize函数中简单地调用CObArray.Serialize函数,而CObArray的Serialize函数又依据所存放的对象指针类型调用相应类对象的Serialize函数,完成实际的数据读写操作,从而实现了二维图形对象不同数据类型和个数的序列化。再次,在用鼠标进行屏幕绘图的鼠标消息处理函数代码中,在OnLButtonUp函数内,对不同的二维
16、图形对象,分别调用各自的构造函数生成二维图形对象,再把该二维图形对象地址用AddShape函数保存在CObArray数组中,以矩形为例,如下所示:if(CurrentDraw= =DRAW_RECTANGLE)pShape=new CRectangle(m_pOrigin, point, m_pWidth, m_pStyle, m_pColor); /其他二维对象的相应语句段pDoc-AddShape(pShape);其中,pDoc为指向文档的指针;m_pWidth、m_pStyle和m_pColor为视图类的数据成员,分别代表二维图形的线宽、线型和颜色。最后,在OnDraw成员函数中定义一个
17、基类CShape的指针变量pShape,采用循环方法遍历CObArray数组中的所有元素,在for循环内把调用GetShape函数获得的二维图形对象的地址赋给pShape,用pShape调用虚函数Drawing,就可以实现虚函数的多态性,即相同的pShape-Drawing(pDC)函数调用语句,由于pShape所指向的对象不同,实现了调用不同Drawing函数体内容的目的。从而在屏幕上绘出不同的二维图形。实现不同二维图形对象的数据保存和屏幕重绘的过程可以概括为:在视图类中利用鼠标消息处理函数用鼠标绘出二维图形,获得数据;调用各自的构造函数生成二维图形对象,调用AddShape函数把二维图形对
18、象的地址保存在CObArray数组中;在OnDraw函数中,调用GetShape函数从CObArray数组中获得二维图形对象的地址,并赋给基类的指针变量pShape,用pShape调用Drawing虚函数,实现了不同二维图形对象的屏幕重绘;由于CObArray数组本身具有数据序列化功能,因此在文档类的Serialize函数中只需加入对CObArray的Serialize函数的两次调用,即可实现不同图形对象的保存。2. 设计过程与步骤具体的设计过程,可按下列步骤进行。2.1建立绘图程序框架本设计的第一步是使用MFC AppWizard来建立绘图程序的基本框架,步骤为:(1)从File菜单选择Ne
19、w菜单项,弹出New对话框。(2)选择Projects选项卡,从项目类型表框中选择MFC AppWizard(exe),在Project name文本框中输入绘图程序的名字,这里设定为Draw,其他采用默认值。(3)单击OK按钮,弹出MFC AppWizard-Step 1对话框,选中Single document单选按钮和“中文中国”选项,表示要生成以中文为用户界面的单文档(SDI)绘图程序。(4)单击Next按钮,在图2.4所示的MFC AppWizard-Step 6对话框中,单击CDrawView,在Base class的下拉列表框中选择CScrollView,使视图窗口具有滚动功能。
20、(5)单击Finish按钮,表示使用随后的各项默认设置,再单击OK按钮,MFC AppWizard自动生成绘图程序的各项源文件。为了使绘图区(视图客户区)出现水平和垂直滚动条,必须知道图形的总尺寸。为此,需要修改视图类的OnInitiaUpdate函数的内容,将原来的语句:sizeTotal.cx=sizeTotal.cy=100;修改为:sizeTotal.cx=640; sizeTotal.cy=480;其他内容保留不变。AppWizard自动生成了完整的应用程序的基本框架,可以立即选择Build菜单中的Execute Draw.exe菜单项,Visual C+首先进行编译和链接,然后运行
21、该应用程序,可以看到该程序是一个标准的Win32应用程序,它包含有标题、菜单栏、工具栏和状态栏,许多命令都可以操作了。当然,因为还没有给这个程序添加任何自己的代码,所以它还不能做出任何有实际意义的操作。2.2 图形类的定义按照前面分析的设计思路,要定义一个二维图形的基类CShape,它包含颜色、线型和线宽3个共有的数据成员,定义串行化Serialize和绘图Drawing两个虚函数,然后从CShape类派生各类二维图形类:CLine、CBezier、CRect、CEllipse和CPolygon,在每一个二维图形类中定义自己的几何数据,定义构造函数以便生成各自的图像对象,重载Serialize
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计 交互式 绘图 软件设计 指导书 34
限制150内