c++课程设计-交互式绘图软件设计指导书_第1页
c++课程设计-交互式绘图软件设计指导书_第2页
c++课程设计-交互式绘图软件设计指导书_第3页
c++课程设计-交互式绘图软件设计指导书_第4页
c++课程设计-交互式绘图软件设计指导书_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业C+面向对象程序设计课程设计指导书指导实例:交互式绘图软件设计指导书说明:1.本实例软件经设计实作,为可实际运行的软件。指导书中所列程序代码,均为VC+6.0编程环境中可运行代码复制所得,所列示图,均为制作过程中屏幕截图,其目的是使学习者尽快弄清设计原理,掌握过程、方法,起到举一反三、正真领会面向对象程序设计的思想方法,原理,和操作技能的作用。使用中,“1.设计原理”(第3页),供系统设计分析用,实际操作可从“2.操作过程与步骤”(第6页)开始。2.其余推荐题目,可根据

2、自身实际情况,酌情参考使用。1.设计原理面向对象的程序设计是现在最外流行的程序设计方法。面向对象的方法模仿人们建立现实世界模型的方法,认为客观世界是由各种各样的对象组成的,每个对象都有各自的内部状态和运动规律,不同对象之间的相互作用和联系就构成了各种各样的系统。利用人们对事物分类和抽象的自然倾向,引进了类的概念,具有封装性、继承性和多态性等特点。面向对象的程序设计吸取了传统的结构化程序设计的优点,采用数据抽象和信息隐藏技术、将数据与操作封装在一起,用类来抽象代表现实的实体,用类之间的继承关系来代表设计的抽象过程,将问题求解看作是一个非类演绎过程。1.1 类与数据封装在C+中,类是指由用户定义的

3、一种抽象数据类型,将一组具有相关性的数据成员结合在一起,要使用类中所包含的数据时,必须通过有该类所提供的成员函数来存取。数据封装是指将类中的数据成员以其可被使用或不可被使用的方式进行分类,即有条件地限制类中部分或全部的数据成员被使用,在定义数据成员时在其前面冠以private、protected或public,分别表示私有的、保护的和公有的。因此,类是实现数据封装的一个有力方法,类的特性是实现了数据封装或数据抽象。在本设计中,可以把各种图形形状,如直线、矩形、圆、曲线、多边形等定义为各种各样的图形类,将图的具体绘制、存储操作和属性设置定义为图形类的public成员函数,这样就实现了类与数据封装

4、。例如,直线类可以定义为:class Clineprivate:COLORREF m_color;/直线的颜色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();/返回直线的线

5、宽void setLineWidth(int width);/设置直线的线宽POINT getBeginPoint();/返回直线的起点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 COLOR

7、REF getColor();/返回颜色virtual void setColor(COLORREF 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类派生于CShap

8、e类,定义如下:class CLine: public CShapeprivate:POINT m_beginPoint, m_endPoint;/直线的起点和终点public:POINT getBeginPoint();/返回直线的起点POINT getEndPoint();/返回直线的终点void Draw(CDC *pDC);/直线的具体绘制void Serialize(Carchive &ar);/直线的具体存储操作;1.3 虚函数与多态性在面向对象中,多态性是指一个名字有多种含义,或相同界面有多种实现。在继承体系中,如果在派生类中对所继承的成员函数重新定义其功能,该函数应在基类中被定

9、义为虚函数,在成员函数定义时在其前面加上关键字virtual。C+系统能自动判别应该调用哪一个类对象的成员函数。因此,虚函数是一种单界面多实现版本的方法,即函数名、返回类型、参数类型和个数及顺序完全相同,但函数体内容可以完全不同。在本设计中,可以把抽象的图形基类CShape的绘图操作Draw定义为虚函数,直线、矩形、圆、曲线、多边形等作为CShape的派生类,把它们的具体绘图操作定义在各自类中,保留其函数原型(函数名、返回值类型、参数个数及类型、顺序)都不变,然后用指向基类CShape的指针来调用Draw函数,就可以实现虚函数与多态性,即同样的调用语句因指针所指向的对象不同而画出不同的图像。如

10、下所示:CShape *pShape;/定义指向基类CShape的指针pShapeCLine line;/定义一个直线类的对象linepShape=&line;/将line的地址赋给pShapepShape-Draw(pDC);/绘制直线Crectangle rect;/定义一个矩形类的对象rectpShape=▭/将CRectangle的地址赋给pShapepShape-Draw(pDC);/绘制矩形CCircle circle ;/定义一个圆对象circlepShape=&circle;/将circle的地址赋给pShapepShape-Draw(pDC);/绘制圆可见,同样的语

11、句“pShape-Draw(pDC);”,却能绘制出不同的图形,这就是虚函数与多态性的功能特点。1.4 数据存储与屏幕重绘绘图程序Draw要求能用鼠标在屏幕上绘制直线、贝济埃曲线、圆、椭圆、矩形、多边形等基本二维图形,并提供相应的文件保存和屏幕重绘功能。二维图形包括许多种类型,用于表征这些二维图形对象的数据是不同的,它们都有颜色、线型和线宽3个属性数据,但它们的几何数据不同,点用一个坐标点数据表示,直线、圆、椭圆和矩形用两个坐标点数据表示,圆角矩形用两个坐标点数据和两个整型数据来表示,圆弧或椭圆弧、饼图或扇形用4个坐标点数据表示,贝济埃曲线用4个以上的坐标点数据表示,而多边形所需的坐标点数据个

12、数是任意的。另外,对于封闭图形,还可以有填充与不填充选择,若填充,还可以选择颜色、影线和图案3种模式之一。因此,如何实现对这些具有不同数据类型和个数图形对象的保存,以及如何根据保存的数据区别不同图形对象并进行屏幕重绘,是本设计要解决的关键问题。从MFC的文档/视图结构可知,应用程序的数据保存专门由文档类的Serialize函数负责具体完成,应用程序的数据显示或屏幕重绘专门由视图类的OnDraw函数负责具体完成。如果在二维图形基类CShape定义中把负责数据保存的成员函数Serialize和负责图形绘制的成员函数Drawing说明为虚函数,在派生类即具体的二维图形类定义中只对Serialize和

13、Drawing的函数内容重新定义,保留其函数名、返回值类型和参数(包括类型和个数)不变,用一个指向基类CShape的指针访问虚函数Serialize和Drawing,就可以实现画图程序具有不同数据类型和个数的二维图形对象的保存,以及根据保存的数据区别不同图形对象在屏幕上重新绘制出来。在MFC类库中,集合类是专门用于数据保存的。集合类又分为数组类、链表类和映射类(也称数据字典类)。它们都能适用于各种数据类型,如BYTE、WORD、int、float、String、对象地址或对象指针等。从前面的分析可以看出,在画图程序中需要保存的数据是各二维图形对象的地址,因此可以选用数组类的CObArray/C

14、PtrArray或链表类的CObList/CPtrList。在MFC中,数组是采用动态数组,链表是采用双向链表。数组和链表对存取数据的操作各有优缺点。在本设计中,可以简单地选用CObArray来存放二维图形对象的地址。1.5 设计思路综上所述,可以总结设计思路如下:首先定义一个二维图形的基类CShape,它包含颜色、线型和线宽3个共有的数据成员,定义串行化Serialize和绘图Drawing两个虚函数,然后从CShape类派生上述各二维图形类:CLine、CCircle、CEllipse、CRectangle、CBezier和CPolygon等,在每一个二维图形类中定义自己的几何数据,定义构

15、造函数以便生产各自的图形对象,重载Serialize和Drawing函数,以实现各自不同的数据序列化和屏幕重绘。其次,在文档类中定义一个可以保存各二维图形对象地址的CObArray数组,并定义3个操作该CObArray数组的文档类成员函数AddShape、GetShape、GetShapeNumber。视图类是使用这些函数的重要用户。在文档类的Serialize函数中简单地调用CObArray.Serialize函数,而CObArray的Serialize函数又依据所存放的对象指针类型调用相应类对象的Serialize函数,完成实际的数据读写操作,从而实现了二维图形对象不同数据类型和个数的序列

16、化。再次,在用鼠标进行屏幕绘图的鼠标消息处理函数代码中,在OnLButtonUp函数内,对不同的二维图形对象,分别调用各自的构造函数生成二维图形对象,再把该二维图形对象地址用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_pCo

17、lor为视图类的数据成员,分别代表二维图形的线宽、线型和颜色。最后,在OnDraw成员函数中定义一个基类CShape的指针变量pShape,采用循环方法遍历CObArray数组中的所有元素,在for循环内把调用GetShape函数获得的二维图形对象的地址赋给pShape,用pShape调用虚函数Drawing,就可以实现虚函数的多态性,即相同的pShape-Drawing(pDC)函数调用语句,由于pShape所指向的对象不同,实现了调用不同Drawing函数体内容的目的。从而在屏幕上绘出不同的二维图形。实现不同二维图形对象的数据保存和屏幕重绘的过程可以概括为:在视图类中利用鼠标消息处理函数用

18、鼠标绘出二维图形,获得数据;调用各自的构造函数生成二维图形对象,调用AddShape函数把二维图形对象的地址保存在CObArray数组中;在OnDraw函数中,调用GetShape函数从CObArray数组中获得二维图形对象的地址,并赋给基类的指针变量pShape,用pShape调用Drawing虚函数,实现了不同二维图形对象的屏幕重绘;由于CObArray数组本身具有数据序列化功能,因此在文档类的Serialize函数中只需加入对CObArray的Serialize函数的两次调用,即可实现不同图形对象的保存。2. 设计过程与步骤具体的设计过程,可按下列步骤进行。2.1建立绘图程序框架本设计的

19、第一步是使用MFC AppWizard来建立绘图程序的基本框架,步骤为:(1)从File菜单选择New菜单项,弹出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对话框中,单击CDra

20、wView,在Base class的下拉列表框中选择CScrollView,使视图窗口具有滚动功能。(5)单击Finish按钮,表示使用随后的各项默认设置,再单击OK按钮,MFC AppWizard自动生成绘图程序的各项源文件。为了使绘图区(视图客户区)出现水平和垂直滚动条,必须知道图形的总尺寸。为此,需要修改视图类的OnInitiaUpdate函数的内容,将原来的语句:sizeTotal.cx=sizeTotal.cy=100;修改为:sizeTotal.cx=640; sizeTotal.cy=480;其他内容保留不变。AppWizard自动生成了完整的应用程序的基本框架,可以立即选择Bu

21、ild菜单中的Execute Draw.exe菜单项,Visual C+首先进行编译和链接,然后运行该应用程序,可以看到该程序是一个标准的Win32应用程序,它包含有标题、菜单栏、工具栏和状态栏,许多命令都可以操作了。当然,因为还没有给这个程序添加任何自己的代码,所以它还不能做出任何有实际意义的操作。2.2 图形类的定义按照前面分析的设计思路,要定义一个二维图形的基类CShape,它包含颜色、线型和线宽3个共有的数据成员,定义串行化Serialize和绘图Drawing两个虚函数,然后从CShape类派生各类二维图形类:CLine、CBezier、CRect、CEllipse和CPolygon

22、,在每一个二维图形类中定义自己的几何数据,定义构造函数以便生成各自的图像对象,重载Serialize和Drawing函数,以实现各自不同的数据序列化和屏幕重绘。为了把新定义的图形类单独存放在一个头文件中,在Draw项目已打开的情况下,选择Project Add To Project New命令,在随之弹出的New对话框的Files选项卡中,选择C/C+ Header File,在File文本框中输入新类CShape的头文件名shape,最后单击OK按钮即可。Visual C+关闭New对话框,并在用户工作区中打开一个空白窗口,让用户进行新类的定义。重复上述步骤,但在New对话框的Files选项

23、卡中,选择C+ Source File,以便生成一个空白的实现文件。然后将下面7个类的定义代码放到shape.h文件中,把它们的实现代码放到shape.cpp文件中,并在shape.cpp文件的开头加入下列两行:#include “stdafx.h”#include “shape.h”最后在DrawDoc.h文件开头加入对shape.h的包含语句:#include “shape.h”2.2.1 图形基类CShape1. CShape定义代码class CShape:public CObjectprotected:COLORREF m_pColor;int m_pWidth, m_pStyle;

24、CShape()DECLARE_SERIAL(CShape)public:virtual void Drawing(CDC *pDC)virtual void Serialize(CArchive &ar);2.CShape类实现代码IMPLEMENT_SERIAL(CShape, CObject, 1)void CShape:Serialize(CArchive &ar)if(ar.IsStoring()arm_pColorm_pWidthm_pColorm_pWidthm_pStyle;2.2.2 直线类CLine1. CLine类定义代码class CLine:public CShape

25、protected:POINT m_pStart, m_pEnd;CLine()DECLARE_SERIAL(CLine)public:CLine(POINT pStart, POINT pEnd, int Width, int Style, COLORREF color);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CLine类实现代码IMPLEMENT_SERIAL(CLine, CShape, 1)CLine:CLine(POINT pStart, POINT pEnd, int Width, int St

26、yle, COLORREF Color)m_pStart=pStart; m_pEnd=pEnd;m_pWidth=Width; m_pStyle=Style; m_pColor=Color;void CLine:Drawing(CDC *pDC)CPen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-MoveTo(m_pStart); pDC-LineTo(m_pEnd);pDC-SelectObject(pOldPen);void C

27、Line:Serialize(CArchive &ar)if(ar.IsStoring()arm_pStart.xm_pStart.ym_pEnd.xm_pStart.xm_pStart.ym_pEnd.xm_pEnd.y;CShape:Serialize(ar);2.2.3 贝济埃曲线类CBezier1. CBezier类定义代码class CBezier:public CShapeprotected:POINT m_pPoints20;int m_pNum;CBezier()DECLARE_SERIAL(CBezier)public:CBezier(POINT points20, int

28、n, int Width, int Style, COLORREF color);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CBezier类实现代码IMPLEMENT_SERIAL(CBezier, CShape, 1)CBezier:CBezier(POINT points20, int n, int Width, int Style, COLORREF Color)m_pNum=n;for(int i=0; iSelectObject(&NewPen);pDC-PolyBezier(m_pPoints, m

29、_pNum);pDC-SelectObject(pOldPen);void CBezier:Serialize(CArchive &ar)int i;if(ar.IsStoring()arm_pNum;for(i=0; im_pNum; i+) arm_pNum;for(i=0; im_pPointsi;CShape:Serialize(ar);2.2.4 矩形类CRectangle1. CRectangle类定义代码class CRectangle:public CShapeprotected:POINT m_pFP, m_pSP;COLORREF m_FColor;int m_FFlag,

30、 m_HFlag, m_pHatch;CRectangle()DECLARE_SERIAL(CRectangle)public:CRectangle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color,int m_FFlag, COLORREF FColor, int HFlag, int pHatch);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CRectangle类实现代码IMPLEMENT_SERIAL(CRectangle, CShape

31、, 1)CRectangle:CRectangle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int pHatch)m_pFP=pFP; m_pSP=pSP;m_pWidth=Width; m_pStyle=Style; m_pColor=Color;m_FFlag=FFlag; m_FColor=FColor;m_HFlag=HFlag; m_pHatch=pHatch;void CRectangle:Drawing(CDC *pDC)C

32、Pen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pOldBrush;if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_pHatch, m_FColor);pOldBrush=pDC-SelectObject

33、(&NewBrush);pDC-Rectangle(m_pFP.x, m_pFP.y, m_pSP.x, m_pSP.y);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CRectangle:Serialize(CArchive &ar)if(ar.IsStoring()arm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pHatch;CShap

34、e:Serialize(ar);2.2.5 圆类CCircle1. CCircle类定义代码class CCircle: public CShapeprotected:POINT m_pFP, m_pSP;COLORREF m_FColor;int m_FFlag, m_HFlag, m_HPattern;CCircle()DECLARE_SERIAL(CCircle)public:CCircle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int m_FFlag, COLORREF FColor, int HFlag

35、, int HPattern);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);void VCCircle(CDC *pDC);2. CCircle类实现代码IMPLEMENT_SERIAL(CCircle, CShape, 1)CCircle:CCircle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int HPattern)m_pFP=pFP; m_pSP=pSP;

36、m_pWidth=Width; m_pStyle=Style; m_pColor=Color;m_FFlag=FFlag; m_FColor=FColor;m_HFlag=HFlag; m_HPattern=HPattern;void CCircle:Drawing(CDC *pDC)CPen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pO

37、ldBrush;if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_HPattern, m_FColor);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Ellipse(m_pFP.x, m_pFP.y, m_pSP.x, m_pSP.y);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CCircle:VCCircle(CDC *p

38、DC) CPen NewPen,*pOldPen;NewPen.CreatePen(m_pStyle,m_pWidth,m_pColor);pOldPen=pDC-SelectObject(&NewPen); pDC-SelectStockObject(NULL_BRUSH); CBrush NewBrush,*pOldBrush; if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor); else NewBrush.CreateHatchBrush(m_HPattern,m_FColor); pOldBrush=pDC-Sele

39、ctObject(&NewBrush);pDC-Ellipse(m_pFP.x,m_pFP.y,m_pSP.x,m_pSP.y); pDC-SelectObject(pOldPen); if(m_FFlag)pDC-SelectObject(pOldBrush);void CCircle:Serialize(CArchive &ar)if(ar.IsStoring()arm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_pColorm_HFlagm_HPattern;CS

40、hape:Serialize(ar);2.2.6 椭圆类CEllipse1. CEllipse类定义代码class CEllipse: public CShapeprotected:POINT m_pFP, m_pSP;COLORREF m_FColor;int m_FFlag, m_HFlag, m_pHatch;CEllipse()DECLARE_SERIAL(CEllipse)public:CEllipse(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color,int m_FFlag, COLORREF FColor, in

41、t HFlag, int pHatch);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CEllipse类实现代码IMPLEMENT_SERIAL(CEllipse, CShape, 1)CEllipse:CEllipse(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int pHatch)m_pFP=pFP; m_pSP=pSP;m_pWidth=Width; m

42、_pStyle=Style; m_pColor=Color;m_FFlag=FFlag; m_FColor=FColor;m_HFlag=HFlag; m_pHatch=pHatch;void CEllipse:Drawing(CDC *pDC)CPen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pOldBrush;if(m_FFlag)i

43、f(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_pHatch, m_FColor);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Ellipse(m_pFP.x, m_pFP.y, m_pSP.x, m_pSP.y);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CEllipse:Serialize(CArchive &ar)if(ar.IsStori

44、ng()arm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pHatch;CShape:Serialize(ar);2.2.7 多边形类CPolygon1. CPolygon类定义代码class CPolygon: public CShapeprotected:POINT m_pPoints20;int m_pNum;COLORREF m_FColor;int m_FFlag, m_HFlag, m_pHatch;CPolygon()DEC

45、LARE_SERIAL(CPolygon)public:CPolygon(POINT points20, int n, int Width, int Style, COLORREF Color,int FFlag, COLORREF FColor, int HFlag, int pHatch);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CPolygon类实现代码IMPLEMENT_SERIAL(CPolygon, CShape, 1)CPolygon:CPolygon(POINT points20, int n

46、, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int pHatch)m_pNum=n;for(int i=0; iSelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pOldBrush;if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_pHatch, m_F

47、Color);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Polygon(m_pPoints, m_pNum);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CPolygon:Serialize(CArchive &ar)int i;if(ar.IsStoring()arm_pNum;for(i=0; im_pNum; i+) arm_pPointsi;arm_FFlagm_FColorm_HFlagm_pNum;for(i=0; im_pPointsi;ar

48、m_FFlagm_FColorm_HFlagm_pHatch;CShape:Serialize(ar);2.3 增加绘图菜单为了能通过选择菜单而选择绘图命令,并能通过菜单而选择颜色、线型和填充等选项,首先必须设计好“绘图”和“选项”菜单,然后进行消息映射,编写消息处理函数的代码。1. 增加菜单资源打开资源浏览器窗口,显示程序资源。单击Draw Resource左边的“+”,使文件夹扩展,然后双击Menu项下的IDR_MAINFRAME标识符,打开菜单编辑器窗口,单击“帮助”菜单,按Insert键,插入一个空白框,输入新菜单名“绘图(&D)”。然后在“绘图”菜单下增加绘制二维图形的菜单项共6个,

49、按表2.1所示设置各菜单项的标题和ID值。表2.1 “绘图”菜单的命令标识符和标题 ID标题(Caption)ID_DRAW_VCLINEID_DRAW_BEZIERID_DRAW_RECTANGLEID_DRAW_VCCIRCLEID_DRAW_VCELLIPSEID_DRAW_POLYGON直线(&L)贝济埃曲线(&B)矩形(&R)圆(&C)椭圆(&E)多边形(&P)接着,再次单击“帮助”菜单,按Insert键,插入一个空白框,输入新菜单名“选项(&O)”。然后在“选项”菜单下增加“画笔”、“线型颜色”、“填充颜色”、“填充影线”、“无填充”5个菜单项,其中“填充影线”带有7个子菜单,如图

50、2.1和表2.2所示。图2.1 “选项”菜单及其“填充影线”子菜单表2.2 “选项”菜单的命令标识符和标题 ID标题(Caption) ID_OPTIONS_PEN ID_OPTIONS_COLOR ID_OPTIONS_FILLCOLOR ID_OPTIONS_HATCHF ID_OPTIONS_HATCHB ID_OPTIONS_HATCHC ID_OPTIONS_HATCHD ID_OPTIONS_HATCHH ID_OPTIONS_HATCHV ID_OPTIONS_HATCHNULL 画笔(&P)线型颜色(&C)填充颜色(&Y)斜线(&F)反斜线(&B) 十字线(&C) 斜十字线(&

51、D) 水平线(&H) 垂直线(&V) 无影线(&F) 2. 进行菜单命令的消息映射为了便于保留用户对菜单的单击选择,需要把这些菜单命令消息都映射给文档。首先对“绘图”菜单进行消息映射。选择View菜单下的ClassWizard菜单项,在ClassWizard对话框中选择Message Maps选项卡,在Class name下拉列表框中选择CDrawView类,在Object IDs列表框中选择ID_DRAW_LINE,在Message列表框中选择COMMAND,然后单击Add Function按钮,在随后的一个确认对话框中单击OK按钮,完成一个消息映射。用同样的方法对Object IDs列表框

52、中其他的5个ID号,ID_DRAW_BEZIER、ID_DRAW_RECTANGLE、ID_DRAW_CIRCLE、ID_DRAW_ELLIPSE和ID_DRAW_POLYGON进行消息映射。用同样的方法对“选项”菜单下的菜单项进行消息映射。3. 编写菜单命令的消息处理函数代码为了便于源程序阅读,定义一些符号常量来方便用户对“绘图”菜单的选择。在视图类实现文件(DrawView.cpp)的开头添加如下:enum DRAW_VCLINE, DRAW_BEZIER, DRAW_RECTANGLE, DRAW_VCCIRCLE,DRAW_VCELLIPSE, DRAW_POLYGON;同时必须在视图

53、类定义(DrawView.h)中定义一些变量来保留用户对菜单所做的选择,如下:public:int m_pWidth, m_pStyle;COLORREF m_pColor;int CurrentDraw;COLORREF m_FColor;int m_FFlag, m_Hatch, m_HFlag;然后在视图类构造函数中添加CurrentDraw的初始化代码,如下:m_pWidth=1; m_pStyle=PS_SOLID;m_pColor=RGB(0,0,0);CurrentDraw=DRAW_VCLINE;m_FColor=RGB(0,0,0);m_FFlag=0; m_HFlag=0;

54、在以生成的消息处理函数框架中添加如下代码(粗体部分):void CDrawView:OnDrawVcline() / TODO: Add your command handler code hereCurrentDraw=DRAW_VCLINE;void CDrawView:OnDrawBezier() / TODO: Add your command handler code hereCurrentDraw=DRAW_BEZIER;void CDrawView:OnDrawRectangle() / TODO: Add your command handler code hereCurren

55、tDraw=DRAW_RECTANGLE;void CDrawView:OnDrawVccircle() / TODO: Add your command handler code hereCurrentDraw=DRAW_VCCIRCLE;void CDrawView:OnDrawVcellipse() / TODO: Add your command handler code hereCurrentDraw=DRAW_VCELLIPSE;void CDrawView:OnDrawPolygon() / TODO: Add your command handler code hereCurr

56、entDraw=DRAW_POLYGON;void CDrawView:OnOptionsColor() / TODO: Add your command handler code hereCColorDialog ColorDialog;if(ColorDialog.DoModal()=IDOK)m_pColor=ColorDialog.GetColor();m_FFlag=1;void CDrawView:OnOptionsFillcolor() / TODO: Add your command handler code hereCColorDialog ColorDialog;if(Co

57、lorDialog.DoModal()=IDOK)m_FColor=ColorDialog.GetColor();m_FFlag=1;void CDrawView:OnOptionsHatchb() / TODO: Add your command handler code herem_Hatch=HS_BDIAGONAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchc() / TODO: Add your command handler code herem_Hatch=HS_CROSS;m_HFlag=1;m_FFlag=1;void

58、CDrawView:OnOptionsHatchd() / TODO: Add your command handler code herem_Hatch=HS_DIAGCROSS;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchf() / TODO: Add your command handler code herem_Hatch=HS_FDIAGONAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchh() / TODO: Add your command handler code he

59、rem_Hatch=HS_HORIZONTAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchnull() / TODO: Add your command handler code herem_HFlag=0;void CDrawView:OnOptionsHatchv() / TODO: Add your command handler code herem_Hatch=HS_VERTICAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsNofill() / TODO: Add your com

60、mand handler code herem_FFlag=0;2.4 在屏幕上画图为了能用鼠标在屏幕上作图,当然必须要控制鼠标。控制鼠标的方法就是对鼠标消息进行映射,在鼠标消息的处理函数中加上画图的代码,这是实现用鼠标在屏幕上画图的基本思路。由于在屏幕上(空白区)画图是与视图有关的,所以,以下的具体步骤都是在视图类中进行的。1. 用ClassWizard映射鼠标消息在视图类中用ClassWizard来映射鼠标消息的方法为:(1)从View菜单中选择ClassWizard命令,弹出MFC ClassWizard对话框。(2)选择Message Maps选项卡(一般默认为Message Maps

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论