c++课程设计交互式绘图软件设计指导书.docx

上传人:b****1 文档编号:2604623 上传时间:2023-05-04 格式:DOCX 页数:54 大小:775.74KB
下载 相关 举报
c++课程设计交互式绘图软件设计指导书.docx_第1页
第1页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第2页
第2页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第3页
第3页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第4页
第4页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第5页
第5页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第6页
第6页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第7页
第7页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第8页
第8页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第9页
第9页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第10页
第10页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第11页
第11页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第12页
第12页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第13页
第13页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第14页
第14页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第15页
第15页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第16页
第16页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第17页
第17页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第18页
第18页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第19页
第19页 / 共54页
c++课程设计交互式绘图软件设计指导书.docx_第20页
第20页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

c++课程设计交互式绘图软件设计指导书.docx

《c++课程设计交互式绘图软件设计指导书.docx》由会员分享,可在线阅读,更多相关《c++课程设计交互式绘图软件设计指导书.docx(54页珍藏版)》请在冰点文库上搜索。

c++课程设计交互式绘图软件设计指导书.docx

c++课程设计交互式绘图软件设计指导书

《C++面向对象程序设计》课程设计指导书

指导实例:

交互式绘图软件设计指导书

说明:

1.本实例软件经设计实作,为可实际运行的软件。

指导书中所列程序代码,均为VC++6.0编程环境中可运行代码复制所得,所列示图,均为制作过程中屏幕截图,其目的是使学习者尽快弄清设计原理,掌握过程、方法,起到举一反三、正真领会面向对象程序设计的思想方法,原理,和操作技能的作用。

使用中,“1.设计原理”(第3页),供系统设计分析用,实际操作可从“2.操作过程与步骤”(第6页)开始。

2.其余推荐题目,可根据自身实际情况,酌情参考使用。

 

1.设计原理

面向对象的程序设计是现在最外流行的程序设计方法。

面向对象的方法模仿人们建立现实世界模型的方法,认为客观世界是由各种各样的对象组成的,每个对象都有各自的内部状态和运动规律,不同对象之间的相互作用和联系就构成了各种各样的系统。

利用人们对事物分类和抽象的自然倾向,引进了类的概念,具有封装性、继承性和多态性等特点。

面向对象的程序设计吸取了传统的结构化程序设计的优点,采用数据抽象和信息隐藏技术、将数据与操作封装在一起,用类来抽象代表现实的实体,用类之间的继承关系来代表设计的抽象过程,将问题求解看作是一个非类演绎过程。

1.1类与数据封装

在C++中,类是指由用户定义的一种抽象数据类型,将一组具有相关性的数据成员结合在一起,要使用类中所包含的数据时,必须通过有该类所提供的成员函数来存取。

数据封装是指将类中的数据成员以其可被使用或不可被使用的方式进行分类,即有条件地限制类中部分或全部的数据成员被使用,在定义数据成员时在其前面冠以private、protected或public,分别表示私有的、保护的和公有的。

因此,类是实现数据封装的一个有力方法,类的特性是实现了数据封装或数据抽象。

在本设计中,可以把各种图形形状,如直线、矩形、圆、曲线、多边形等定义为各种各样的图形类,将图的具体绘制、存储操作和属性设置定义为图形类的public成员函数,这样就实现了类与数据封装。

例如,直线类可以定义为:

classCline

{

private:

COLORREFm_color;//直线的颜色

intm_lineWidth,m_lineStyle;//直线的线宽和直线的线型

POINTm_beginPoint,m_endPoint;//直线的起点和终点

public:

COLORREFgetColor();//返回直线的颜色

voidsetColor(COLORREFcolor);//设置直线的颜色

intgetLineStyle();//返回直线的线型

voidsetLingStyle(UINTstyle);//设置直线的线型

intgetLineWidth();//返回直线的线宽

voidsetLineWidth(intwidth);//设置直线的线宽

POINTgetBeginPoint();//返回直线的起点

POINTgetEndPoint();//返回直线的终点

voidDraw(CDC*pDC);//直线的具体绘制

voidSerialize(CArchive&ar);

};

1.2派生类与继承性

在C++中,派生类和继承性是指用户可以利用已有的类(称为基类或父类)定义出新的类(派生类或子类),派生类中不但拥有基类中的全部或部分数据成员与成员函数,而且还可以定义新的数据成员与成员函数。

在本设计中,要绘制的图形形状很多,如直线、矩形、圆、曲线、多边形等。

虽然图形的形状差别很大,其数据成员和成员函数也有许多不同之处,但是如果从抽象的角度出发,它们有些数据成员和成员函数是相同的,如颜色、线型、线宽属性以及设置或获取这些属性的成员函数,因此可以把这些共同点定义为一个基类CShape,然后从CShape类派生出直线类、矩形类、圆类、曲线类、多边形类等,这样,每个派生类都继承有这些共同点,又可以定义自己独特的数据成员和成员函数,程序结构更加简练合理。

CShape类的定义如下:

classCShape

{

protected:

COLORREFm_color;//颜色

intm_lineWidth,m_lineStyle;//线宽和线型

public:

virtualCOLORREFgetColor();//返回颜色

virtualvoidsetColor(COLORREFcolor);//设置颜色

virtualintgetLineStyle();//返回线型

virtualintsetLineStyle(intstyle);//设置线型

virtualintgetLineWidth();//返回线宽

virtualvoidsetLineWidth(intwidth);//设置线宽

virtualvoidDraw(CDC*pDC);//绘图

virtualvoidSerialize(Carchive&ar);//存储操作

};

而CLine类派生于CShape类,定义如下:

classCLine:

publicCShape

{

private:

POINTm_beginPoint,m_endPoint;//直线的起点和终点

public:

POINTgetBeginPoint();//返回直线的起点

POINTgetEndPoint();//返回直线的终点

voidDraw(CDC*pDC);//直线的具体绘制

voidSerialize(Carchive&ar);//直线的具体存储操作

};

1.3虚函数与多态性

在面向对象中,多态性是指一个名字有多种含义,或相同界面有多种实现。

在继承体系中,如果在派生类中对所继承的成员函数重新定义其功能,该函数应在基类中被定义为虚函数,在成员函数定义时在其前面加上关键字virtual。

C++系统能自动判别应该调用哪一个类对象的成员函数。

因此,虚函数是一种单界面多实现版本的方法,即函数名、返回类型、参数类型和个数及顺序完全相同,但函数体内容可以完全不同。

在本设计中,可以把抽象的图形基类CShape的绘图操作Draw定义为虚函数,直线、矩形、圆、曲线、多边形等作为CShape的派生类,把它们的具体绘图操作定义在各自类中,保留其函数原型(函数名、返回值类型、参数个数及类型、顺序)都不变,然后用指向基类CShape的指针来调用Draw函数,就可以实现虚函数与多态性,即同样的调用语句因指针所指向的对象不同而画出不同的图像。

如下所示:

CShape*pShape;//定义指向基类CShape的指针pShape

CLineline;//定义一个直线类的对象line

pShape=&line;//将line的地址赋给pShape

pShape->Draw(pDC);//绘制直线

Crectanglerect;//定义一个矩形类的对象rect

pShape=▭//将CRectangle的地址赋给pShape

pShape->Draw(pDC);//绘制矩形

CCirclecircle;//定义一个圆对象circle

pShape=&circle;//将circle的地址赋给pShape

pShape->Draw(pDC);//绘制圆

可见,同样的语句“pShape->Draw(pDC);”,却能绘制出不同的图形,这就是虚函数与多态性的功能特点。

1.4数据存储与屏幕重绘

绘图程序Draw要求能用鼠标在屏幕上绘制直线、贝济埃曲线、圆、椭圆、矩形、多边形等基本二维图形,并提供相应的文件保存和屏幕重绘功能。

二维图形包括许多种类型,用于表征这些二维图形对象的数据是不同的,它们都有颜色、线型和线宽3个属性数据,但它们的几何数据不同,点用一个坐标点数据表示,直线、圆、椭圆和矩形用两个坐标点数据表示,圆角矩形用两个坐标点数据和两个整型数据来表示,圆弧或椭圆弧、饼图或扇形用4个坐标点数据表示,贝济埃曲线用4个以上的坐标点数据表示,而多边形所需的坐标点数据个数是任意的。

另外,对于封闭图形,还可以有填充与不填充选择,若填充,还可以选择颜色、影线和图案3种模式之一。

因此,如何实现对这些具有不同数据类型和个数图形对象的保存,以及如何根据保存的数据区别不同图形对象并进行屏幕重绘,是本设计要解决的关键问题。

从MFC的文档/视图结构可知,应用程序的数据保存专门由文档类的Serialize函数负责具体完成,应用程序的数据显示或屏幕重绘专门由视图类的OnDraw函数负责具体完成。

如果在二维图形基类CShape定义中把负责数据保存的成员函数Serialize和负责图形绘制的成员函数Drawing说明为虚函数,在派生类即具体的二维图形类定义中只对Serialize和Drawing的函数内容重新定义,保留其函数名、返回值类型和参数(包括类型和个数)不变,用一个指向基类CShape的指针访问虚函数Serialize和Drawing,就可以实现画图程序具有不同数据类型和个数的二维图形对象的保存,以及根据保存的数据区别不同图形对象在屏幕上重新绘制出来。

在MFC类库中,集合类是专门用于数据保存的。

集合类又分为数组类、链表类和映射类(也称数据字典类)。

它们都能适用于各种数据类型,如BYTE、WORD、int、float、String、对象地址或对象指针等。

从前面的分析可以看出,在画图程序中需要保存的数据是各二维图形对象的地址,因此可以选用数组类的CObArray/CPtrArray或链表类的CObList/CPtrList。

在MFC中,数组是采用动态数组,链表是采用双向链表。

数组和链表对存取数据的操作各有优缺点。

在本设计中,可以简单地选用CObArray来存放二维图形对象的地址。

1.5设计思路

综上所述,可以总结设计思路如下:

首先定义一个二维图形的基类CShape,它包含颜色、线型和线宽3个共有的数据成员,定义串行化Serialize和绘图Drawing两个虚函数,然后从CShape类派生上述各二维图形类:

CLine、CCircle、CEllipse、CRectangle、CBezier和CPolygon等,在每一个二维图形类中定义自己的几何数据,定义构造函数以便生产各自的图形对象,重载Serialize和Drawing函数,以实现各自不同的数据序列化和屏幕重绘。

其次,在文档类中定义一个可以保存各二维图形对象地址的CObArray数组,并定义3个操作该CObArray数组的文档类成员函数AddShape、GetShape、GetShapeNumber。

视图类是使用这些函数的重要用户。

在文档类的Serialize函数中简单地调用CObArray.Serialize函数,而CObArray的Serialize函数又依据所存放的对象指针类型调用相应类对象的Serialize函数,完成实际的数据读写操作,从而实现了二维图形对象不同数据类型和个数的序列化。

再次,在用鼠标进行屏幕绘图的鼠标消息处理函数代码中,在OnLButtonUp函数内,对不同的二维图形对象,分别调用各自的构造函数生成二维图形对象,再把该二维图形对象地址用AddShape函数保存在CObArray数组中,以矩形为例,如下所示:

if(CurrentDraw==DRAW_RECTANGLE)

{

pShape=newCRectangle(m_pOrigin,point,m_pWidth,m_pStyle,m_pColor);

}

…//其他二维对象的相应语句段

pDoc->AddShape(pShape);

其中,pDoc为指向文档的指针;m_pWidth、m_pStyle和m_pColor为视图类的数据成员,分别代表二维图形的线宽、线型和颜色。

最后,在OnDraw成员函数中定义一个基类CShape的指针变量pShape,采用循环方法遍历CObArray数组中的所有元素,在for循环内把调用GetShape函数获得的二维图形对象的地址赋给pShape,用pShape调用虚函数Drawing,就可以实现虚函数的多态性,即相同的pShape->Drawing(pDC)函数调用语句,由于pShape所指向的对象不同,实现了调用不同Drawing函数体内容的目的。

从而在屏幕上绘出不同的二维图形。

实现不同二维图形对象的数据保存和屏幕重绘的过程可以概括为:

在视图类中利用鼠标消息处理函数用鼠标绘出二维图形,获得数据;调用各自的构造函数生成二维图形对象,调用AddShape函数把二维图形对象的地址保存在CObArray数组中;在OnDraw函数中,调用GetShape函数从CObArray数组中获得二维图形对象的地址,并赋给基类的指针变量pShape,用pShape调用Drawing虚函数,实现了不同二维图形对象的屏幕重绘;由于CObArray数组本身具有数据序列化功能,因此在文档类的Serialize函数中只需加入对CObArray的Serialize函数的两次调用,即可实现不同图形对象的保存。

2.设计过程与步骤

具体的设计过程,可按下列步骤进行。

2.1建立绘图程序框架

本设计的第一步是使用MFCAppWizard来建立绘图程序的基本框架,步骤为:

(1)从File菜单选择New菜单项,弹出New对话框。

(2)选择Projects选项卡,从项目类型表框中选择MFCAppWizard(exe),在Projectname文本框中输入绘图程序的名字,这里设定为Draw,其他采用默认值。

(3)单击OK按钮,弹出MFCAppWizard-Step1对话框,选中Singledocument单选按钮和“中文[中国]”选项,表示要生成以中文为用户界面的单文档(SDI)绘图程序。

(4)单击Next按钮,在图2.4所示的MFCAppWizard-Step6对话框中,单击CDrawView,在Baseclass的下拉列表框中选择CScrollView,使视图窗口具有滚动功能。

(5)单击Finish按钮,表示使用随后的各项默认设置,再单击OK按钮,MFCAppWizard自动生成绘图程序的各项源文件。

为了使绘图区(视图客户区)出现水平和垂直滚动条,必须知道图形的总尺寸。

为此,需要修改视图类的OnInitiaUpdate函数的内容,将原来的语句:

sizeTotal.cx=sizeTotal.cy=100;

修改为:

sizeTotal.cx=640;sizeTotal.cy=480;

其他内容保留不变。

AppWizard自动生成了完整的应用程序的基本框架,可以立即选择Build菜单中的ExecuteDraw.exe菜单项,VisualC++首先进行编译和链接,然后运行该应用程序,可以看到该程序是一个标准的Win32应用程序,它包含有标题、菜单栏、工具栏和状态栏,许多命令都可以操作了。

当然,因为还没有给这个程序添加任何自己的代码,所以它还不能做出任何有实际意义的操作。

2.2图形类的定义

按照前面分析的设计思路,要定义一个二维图形的基类CShape,它包含颜色、线型和线宽3个共有的数据成员,定义串行化Serialize和绘图Drawing两个虚函数,然后从CShape类派生各类二维图形类:

CLine、CBezier、CRect、CEllipse和CPolygon,在每一个二维图形类中定义自己的几何数据,定义构造函数以便生成各自的图像对象,重载Serialize和Drawing函数,以实现各自不同的数据序列化和屏幕重绘。

为了把新定义的图形类单独存放在一个头文件中,在Draw项目已打开的情况下,选择Project–AddToProject–New命令,在随之弹出的New对话框的Files选项卡中,选择C/C++HeaderFile,在File文本框中输入新类CShape的头文件名shape,最后单击OK按钮即可。

VisualC++关闭New对话框,并在用户工作区中打开一个空白窗口,让用户进行新类的定义。

重复上述步骤,但在New对话框的Files选项卡中,选择C++SourceFile,以便生成一个空白的实现文件。

然后将下面7个类的定义代码放到shape.h文件中,把它们的实现代码放到shape.cpp文件中,并在shape.cpp文件的开头加入下列两行:

#include“stdafx.h”

#include“shape.h”

最后在DrawDoc.h文件开头加入对shape.h的包含语句:

#include“shape.h”

2.2.1图形基类CShape

1.CShape定义代码

classCShape:

publicCObject

{

protected:

COLORREFm_pColor;

intm_pWidth,m_pStyle;

CShape(){}

DECLARE_SERIAL(CShape)

public:

virtualvoidDrawing(CDC*pDC){}

virtualvoidSerialize(CArchive&ar);

};

2.CShape类实现代码

IMPLEMENT_SERIAL(CShape,CObject,1)

voidCShape:

:

Serialize(CArchive&ar)

{

if(ar.IsStoring())

ar<

else

ar>>m_pColor>>m_pWidth>>m_pStyle;

}

2.2.2直线类CLine

1.CLine类定义代码

classCLine:

publicCShape

{

protected:

POINTm_pStart,m_pEnd;

CLine(){}

DECLARE_SERIAL(CLine)

public:

CLine(POINTpStart,POINTpEnd,intWidth,intStyle,COLORREFcolor);

voidDrawing(CDC*pDC);

virtualvoidSerialize(CArchive&ar);

};

2.CLine类实现代码

IMPLEMENT_SERIAL(CLine,CShape,1)

CLine:

:

CLine(POINTpStart,POINTpEnd,intWidth,intStyle,COLORREFColor)

{

m_pStart=pStart;m_pEnd=pEnd;

m_pWidth=Width;m_pStyle=Style;m_pColor=Color;

}

voidCLine:

:

Drawing(CDC*pDC)

{

CPenNewPen,*pOldPen;

NewPen.CreatePen(m_pStyle,m_pWidth,m_pColor);

pOldPen=pDC->SelectObject(&NewPen);

pDC->MoveTo(m_pStart);pDC->LineTo(m_pEnd);

pDC->SelectObject(pOldPen);

}

voidCLine:

:

Serialize(CArchive&ar)

{

if(ar.IsStoring())

ar<

else

ar>>m_pStart.x>>m_pStart.y>>m_pEnd.x>>m_pEnd.y;

CShape:

:

Serialize(ar);

}

2.2.3贝济埃曲线类CBezier

1.CBezier类定义代码

classCBezier:

publicCShape

{

protected:

POINTm_pPoints[20];

intm_pNum;

CBezier(){}

DECLARE_SERIAL(CBezier)

public:

CBezier(POINTpoints[20],intn,intWidth,intStyle,COLORREFcolor);

voidDrawing(CDC*pDC);

virtualvoidSerialize(CArchive&ar);

};

2.CBezier类实现代码

IMPLEMENT_SERIAL(CBezier,CShape,1)

CBezier:

:

CBezier(POINTpoints[20],intn,intWidth,intStyle,COLORREFColor)

{

m_pNum=n;

for(inti=0;i

m_pPoints[i]=points[i];

m_pWidth=Width;m_pStyle=Style;m_pColor=Color;

}

voidCBezier:

:

Drawing(CDC*pDC)

{

CPenNewPen,*pOldPen;

NewPen.CreatePen(m_pStyle,m_pWidth,m_pColor);

pOldPen=pDC->SelectObject(&NewPen);

pDC->PolyBezier(m_pPoints,m_pNum);

pDC->SelectObject(pOldPen);

}

voidCBezier:

:

Serialize(CArchive&ar)

{

inti;

if(ar.IsStoring())

{

ar<

for(i=0;i

}

else

{

ar>>m_pNum;

for(i=0;i>m_pPoints[i];

}

CShape:

:

Serialize(ar);

}

2.2.4矩形类CRectangle

1.CRectangle类定义代码

classCRectangle:

publicCShape

{

protected:

POINTm_pFP,m_pSP;

COLORREFm_FColor;

intm_FFlag,m_HFlag,m_pHatch;

CRectangle(){}

DECLARE_SERIAL(CRectangle)

public:

CRectangle(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,

intm_FFlag,COLORREFFColor

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2