VC++课程设计报告要求及样例

时间:2024.5.8

VC课程设计报告要求及样例

VC课程设计报告要求及样例

附件1: 《Visual C++课程设计》报告格式要求

Visual C++课程设计报告

题目名称:

班级:

姓名(学号):

1 题目(问题)描述

2 功能分析

3 系统设计

3.1 程序总体结构

3.2 主要功能模块设计

3.3 程序界面设计

3.4 类与函数的设计与实现:包括名称、功能、参数说明等 4 运行与测试结果

5 小结

附件2 : 《Visual C++课程设计》实验报告样例

要求:字数不少于3000字(不包括源代码), 报告中的代码不能超过总篇幅的1/5,课程设计报告页数以6-12页为宜。

Visual C++课程设计

题目名称:二维绘图系统

班级:计算0801

姓名:张三

学号:12345678

指导教师:

完成时间:2012.1.6

1 题目描述

利用Visual C++实现一个二维绘图系统。该系统能够进行基本图元的绘制,能够进行图元的组合,能够对图形进行各种编辑操作,并能实现图形文件的输入输出。该系统与目前许多CAD软件(如Microsoft Office Visio软件)的基本功能相似。

2 功能分析

系统主要功能包括:

(1)基本图形元素的绘制

基本图形元素主要包括点、直线、圆弧、圆、椭圆、多边形等。用户能够对基本图形元素的参数进行设置,如圆半径、圆心坐标、线宽、线的颜色等。

(2)图形的缩放

包括基本图形元素、图块的缩放以及整体图形的缩放。

(3)图形的编辑

包括图形参数的修改、删除、移动、旋转、复制、粘贴等。

(4)图形文件的读写

能够将所绘制的组合图元或整个图形保存到文件中,并能够进行文件的读取。 3 系统设计

3.1 系统整体结构

3.1.1 系统中的图形类型划分

在本系统中,主要分为两类图形:基本图形和组合图形(如图1所所示)。其中基本图形主要包括直线、矩形、圆、椭圆、三角形、多边形、文本等。组合图形由基本图形构造而成,如电路中的二极管符号、开关符号等。

图1 系统中的图形类型

3.1.2 对图形的操作

用户可以对图形进行各种操作,主要包括图形的拾取、编辑、填充。其中编辑功能又包括旋转、移动、镜像、复制、剪贴、粘贴、删除、缩放。如图2所示。

VC课程设计报告要求及样例

图2 图形操作

3.2 主要模块设计

3.2.1 图形基类的设计

首先将图形的基本属性归结为一个基类CEntity,基类里包含图形的类型、颜色、线形、线宽等基本属性。由于该类中含有多个纯虚函数,所以该类是抽象类,不能直接创建对象,需要在派生类中覆盖这些纯虚函数,并为派生类创建对象,利用多态性的性质,可以使用抽象基类CEntity的指针访问具体的派生类对象。

图形类的层次如图3所示:

VC课程设计报告要求及样例

图3 平面绘图系统图形类层次

3.2.2 命令类的设计

(1) 面向对象的消息响应机制

消息(Message)表示为能在对象间传递的数据集,它是对象间的通讯机制。设计一个面向对象环境的本质是:对象可以用消息在彼此之间传送控制。在Window环境中,一个特定的消息可以代表一个简单通用的事件,如鼠标移动、按键或客户区刷新;而任何特定的消息可以在不同的对象中引发不同的动作,如按下鼠标左键的消息(WM_LBUTTONDOWN)对于绘制直线和绘制矩形将引发不同的操作行为。

尽管对象接收消息的顺序在程序中是不可预知的,但对象处理每个消息所采取的行为却是显式定义的。例如,在视图类对象中,我们无法知道用户是先单击了鼠标左键还是先单击了鼠标右键,但是我们却可以对这两个消息加入相应的代码从而引发各自的操作行为。

消息可由一个对象发送给另一个对象,或是由操作环境本身发送给某个对象,例如在Window中,诸如WM_LBUTTONDOWN和WM_MOUSEMOVE之类的消息产生于应用程序中;一个对象也可以通过向其他对象或自己发送一条或多条新消息来处理一个消息,有时即使一个简单的动作也包含了层层叠叠的消息处理。

(2) 命令基类的设计

对于创建和修改图元对象的操作可以抽象出一个命令基类CCommand,在该基类中定义了OnLButtonDown(UNIT nflag,const Position & pos)、OnMouseMove(UNIT nflag,const Position & pos)、OnRButtonDown(UNIT nflag,const Position & pos)等几个虚函数。在派生类中对这几个虚函数进行重载,可以得到不同的行为。

(3) 命令类的层次如图4所示:

VC课程设计报告要求及样例

平移类 镜像类 旋转类 复制类 剪切类 粘贴类 删除类

图4 平面绘图系统的命令类层次

3.2.3 主要数据结构

由于图形基类CEntity是从MFC的CObject类派生,所以在系统实现中使用了MFC 库提供的数据结构CObArray和CObList。CObArray是一个数组类,可以保存指向CObject的指针,CEntity是从COject类派生,所以可以将CEntity *指针保存在数组中;CObList类可以将CEntity *指针保存在双向链表中,允许双向查询,速度快。

在本系统的实现中,将绘制的图形元素放在一个CObList类型变量(m_EntityList)的链表中,将组合图形包含的图元放在一个CObList类型变量(m_List)的链表中,将被选中的图形元素放在CObArray类型的数组(m_SelectArray)中,将复制或剪切的图形元素放在CObArray类型的数组(m_CopyArray)中。

3.2.4 文件存储

(1)文件存储格式

文件的存储格式主要有文本格式和二进制格式。文本格式的一个显著优点是可以用文本编辑软件(如记事本)打开文件进行观察和读取。与文本格式不同,二进制格式不能简单的将文件打开编辑。但二进制文件读取速度快,并且能够利用 MFC库进行序列化,是主流的文件输出格式。

(2) 序列化和反序列化

VC课程设计报告要求及样例

序列化就是形成一个二进制文件,用于保存系统中要永久存储的对象数据。序列化能够使程序中的对象永久保存,也就是说关闭程序重新运行后,这些对象仍然可以保留。所谓反序列化就是从文件中读出已序列化的对象,并采用读出的数据给系统数据赋初值,即将数据从硬盘存储转换为内存存储。

在本系统中,序列化就是向一个数据文件中逐个地写入图形元素对象;反序列化就是从二进制文件中读出数据,利用读出的数据实现对CEntity对象的构造。为了完成序列化,MFC保存了已经序列化的数据对象信息。MFC序列化一个文件时,它采用这些信息来动态创建CEntity对象,并自动把它们加载到图形对象列表中。

①类的序列化

可序列化的类必须直接或间接从CObject派生,并且满足两个条件:第一,在类的声明中包含宏DECLARE_SERIAL;第二,在用来实现类成员函数的C++源文件(一般为.CPP文件)中包含宏IMPLEMENT_SERIAL。

②集合的序列化

由于所有的集合类都是从CObject类派生出来的,并且集合类声明中都包含有DECLARE_SERIAL宏调用,因此我们就可以通过调用集合类的Serialize成员函数,很方便地使集合序列化。例如,如果调用了有CEntity对象指针组成的CObList集合的Serialize函数,那么每个CEntity *指针所指向的对象的Serialize函数就会被自动调用。

在MFC应用程序框架中,从文档类CDocument类中派生出来的类可以很方便的实现数据序列化。当用户选择了File菜单中的Save或者Open菜单项时,应用程序框架即会创建CArchive对象(以及内部的CFile对象),然后再调用文档类的Serialize函数,并将CArchive对象的引用传递给它。然后文档派生类的Serialize函数就会对每一个非临时数据成员进行序列化。

3.3 程序界面设计

界面环境作为人机信息交流的通道,主要是辅助用户完成工作。为了方便用户使用,在系统实现中进行了工具栏设计、光标设计和状态栏设计。

3.3.1 工具栏设计

由于只有菜单的系统操作起来不够灵活,系统实现时添加了几个工具栏,用户可以通过工具栏进行相应的操作。在本系统中除了创建工程时自带的工具栏,主要添加了图形绘制工具栏、编辑工具栏和属性工具栏 。通过工具栏资源编辑器添加工具栏按钮并编辑按钮图片。

3.3.2 光标设计

为了使用户得到对于当前操作的立即、可见的反馈,在系统设计时为不同的工作状态设计不同的鼠标形状,使得系统可以根据当前的操作改变光标的形状。例如在画不同的图元时,光标会显示为一个画笔和相应的图元形状,当选中图形时会显示为选中时的形状,从而使用户很清楚正在进行的操作类型。

3.3.3 状态栏设计

虽然光标反馈非常有效,而且可以增强应用程序的外观,但图形反馈还不够精确,这时应用程序应该以精练的语言提供文字反馈。这些消息一般显示于消息框或者屏幕底部的状态栏。在本系统中修改创建工程时自带的状态栏,为其添加显示信息,可以随时显示当前光标的位置坐标(x,y),在绘制和修改图形时会提示用户进行下一步操作,以更好地实现与用户的交互。

3.4 类与函数的设计与实现

3.4.1 逻辑坐标类的设计与实现

Position类为整个绘图系统提供了与逻辑坐标相关操作的支持,它提供了比MFC类库中的CPoint类更为强大的功能。Position类的声明如下:

class Position {

public:

double double x; y;

public:

void const Init(); // 初始化成员变量 Position& operator=(const Position& positionSrc); //重载赋值运算符 friend Position operator+(const Position& position1,const Position& position2); //重载加法运算符

friend Position operator-(const Position& position1,const Position& position2);

//重载减法运算符

friend Position operator*(const Position& position, const double& scale); //重载乘法运算符

double BOOL Distance(const Position& pnt); //计算两点间距离 IsSame(const Position& pointSrc); //判断两点是否重合 Position Offset(const double & deltax,const double & deltay); Position Offset(const Position& off); //对一点进行平移操作 Position Rotate(const Position& basePos, const double angle) ;

//对一点进行旋转操作

Position Mirror(const Position& pos1, const Position& pos2) ;

//对一点进行镜像操作

};

Position对应于二维空间的一个位置,这个位置是存在于客观世界的,即世界坐标。而Windows消息(如WM_MOUSEMOVE)所获得的鼠标光标的坐标值却是设备(屏幕)坐标(CPoint的实例对象)。为了能够将图形元素的世界坐标和计算机的屏幕坐标相联系,就要进行以下操作:

(1)将图形元素的世界坐标转化为屏幕坐标,从而进行图形元素的显示;

(2)由Windows消息得到屏幕坐标,将其转换为世界坐标,然后进行图形元素的处理和存储。

世界坐标与设备坐标的变换是在视类中通过函数WorldtoScreen(const Position& pos,CPoint& screenPt)和ScreentoWorld(CPoint& screenPt, const Position& pos)实现的。 void Serialize(CArchive &ar) ;// 对一点进行序列化

3.4.2 图元类设计与实现

(1)图元基类的实现

将图形的基本属性归结为一个抽象基类CEntity。

CEntity类的声明如下:

class CEntity : public CObject

{

DECLARE_SERIAL(CEntity)

protected:

int m_type; // 图元类型 COLORREF m_color ; // 图元颜色 UINT int m_lineStyle ; // 图元的线型 m_lineWidth ; // 图元的线宽

int isCombin; //标记是否组合图元

public:

CEntity operator = (const CEntity& entity); // 重载等号

virtual CEntity* Copy() { return NULL; } // 指针拷贝

virtual void Init(); // 初始化成员变量值

virtual int GetType() { return m_type; } // 返回图元的类型

COLORREF GetColor() { return m_color; } // 返回图元颜色

void SetColor(COLORREF color) { m_color = color; }

// 设置图元颜色

virtual Position

virtual Position GetDesPos(){return (0,0);} //获得变点坐标 GetBasePos(){return (0,0);} //获得定点坐

virtual void Draw(CDC * pDC, int drawMode = dmNormal ) {};

// 绘制图元对象

virtual BOOL Pick(const Position& pos, const double pick_radius) { return FALSE; } // 给定一点及拾取半径,判断图元是否被选中

virtual void Move(const Position& basePos,const Position& desPos) {}

// 给定一个基点和一个目标点平移图元

virtual void MoveToPos(const Position& desPos) {}

//将图形移动到指定点

virtual void Rotate(const Position& basePos, const double angle) {}

// 给定一个基点和一个角度值旋转图元

virtual void Mirror(const Position& pos1, const Position& pos2){}

// 给定两点,对图元做镜像

virtual void Change(const Position& pos){} //改变图元大小

virtual void Serialize(CArchive& ar) ; // 图元对象串行化

};

(2)直线类的实现

从图元基类CEntity派生出Cline类,在该类中覆盖其父类CEntity中的所有虚函数,并定义两个描述直线所必须的成员变量:直线起点坐标和直线终点坐标。重载父类中定义的函数,在Cline的Draw成员函数中完成对直线绘制的工作;在Draw函数中,对设备环境变量的绘图模式进行设置,创建相应画笔,调用设备环境类的成员函数,绘制直线。

(3)矩形类的实现

声明图元基类CEntity的派生类CRectangle,在该类中覆盖其父类CEntity中的所有虚函数,并定义两个矩形所必须的成员变量:左上角坐标和右下角坐标。对父类函数进行重载,在CRectangle的Draw成员函数中完成对矩形绘制的工作;在Draw函数中,对设备环境变量的绘图模式进行设置,创建相应画笔,调用设备环境类的成员函数,分别绘制矩形的四条边,完成矩形的绘制。

(4)圆弧类的实现

声明图元基类CEntity的派生类CArc,在该类中覆盖其父类CEntity中的所有虚函数,并定义两个描述圆弧所必须的成员变量:圆心坐标、起点坐标和终点坐标。在CArc的Draw成员函数中完成对圆弧绘制的工作;在Draw函数中,对设备环境变量的绘图模式进行设置,创建相应画笔,调用设备环境类的成员函数,调用绘制圆弧的成员函数完成圆弧的绘制。

(5)其它图元类的实现

各基本图元类都是从图元基类CEntity中派生出来的,只是在派生类中添加体现各图元主要特征的变量,如在三角形类中需添加记录三个顶点坐标的Position型变量、在圆和正六边形类中添加一个记录中心点的Position型变量和一个记录半径的double型变量。需要根据各图形的特点重载基类中的函数或实现父类中的虚函数。其基本操作与上述三种图元类似。

(6)组合图元类的实现

组合图形是将前面实现的基本图元组合在一起,将这些图元作为一个整体来实现绘制和编辑。组合图形类也是从图元基类CEntity中派生出来的,其声明如下所示:

class CDesk1: public CEntity

{ DECLARE_SERIAL(CDesk1)

public:

Position basepos; //组合图形的定点 CObList m_list ; // 用链表记录组合图形类中的图元

…………………….

};

3.4.3 命令类设计与实现

绘图系统将用户对各种图元的绘制和操作都视之为 “命令”:对各种图元的绘制与操作工作都转化为对命令的执行。由于这些命令具有很多相似的地方,如都会对鼠标左键按下、鼠标移动、鼠标右键按下等做出消息处理,所以可以抽象出命令基类,再派生出其他命令类。

(1)命令基类的实现

无论是对直线的绘制,还是对其他图元的绘制;无论是对图元的平移操作,还是对图元的其它操作,它们都有很多相似的地方。因此抽象出命令基类CCommand类,作为所有具体命令类的父类。

在CCommand类中,对所有命令的共有特征进行抽象,并定义为虚函数,其声明如下:

class CCommand

{protected:

int m_nStep ; // 记录鼠标左键点击次数,确定执行步骤 public:

CCommand() {} ~CCommand() {} virtual int GetType() = 0; // 返回命令类型 virtual int OnLButtonDown(UINT nFlags, const Position& pos) = 0 ; //点击鼠标左键引起的操作

virtual int OnMouseMove(UINT nFlags, const Position& pos) = 0 ; //鼠标移动时系统执行的操作

virtual int OnRButtonDown(UINT nFlags, const Position& pos) = 0 ; //点击鼠标左键引起的操作

virtual int Cancel() = 0 ; //取消上一步操作

} ;

4 运行与测试结果

4.1 程序主要运行界面

如图5和图6所示。

VC课程设计报告要求及样例

图5 基本运行界面

图6 房间布局设计界面

4.2 系统测试

4.2.1 界面操作测试

通过操作各个菜单项,检查各部分的功能是否与菜单提示一致。例如首先进行图形文件的存取,然后打开已存储的文件,观察绘制结果是否正确,通过操作各个工具栏按钮,检查其是否能够正常工作。

4.2.2 绘制功能测试

通过画线、画矩形、画圆等操作,检查基本图元的绘制是否正确。通过建立、编辑复合图元,检查复合图元相关功能的实现是否正确。通过移动、缩放、最大化、最小化窗口,检查用户区的更新绘制是否正确。

4.2.3 非正常操作测试

进行非正常操作的模拟,如鼠标乱点、乱画,绘制大量的图形等,检查程序的健壮性。 5 小结

实现了一个基本的二维绘图工具软件。主要内容包括简单图元的绘制、拾取、编辑、填充等功能,复合图元的基本操作,数据文件的存储和读取。虽然该绘图工具实现的功能还比较有限,但它初步实现了绘图工具框架,是视图文档类程序的典型应用、体现了面向对象的概念和编程思想。

VC课程设计报告要求及样例

更多相关推荐:
C语言课程设计报告

3130111103福建工程学院C语言课程设计报告班级机械1301学号姓名指导教师日期20xx123020xx133130111103第一部分一问题描述题目1企业发放的奖金根据利润提成利润I低于或等于10万元时...

C课程设计报告

C课程设计报告题目小学算术运算测试设计者刘星刘俊良凌锋专业班级计算机网络0901班学号343337指导教师任长安所属系部计算机与信息科学系20xx年6月20日目录1程序功能简介12主题内容21程序算法22程序结...

C课程设计报告模板

课程设计报课程名称C语言课程设计课题名称通讯录专业纺织工程班级学号姓名指导教师黄晓宇20xx年12月20日告1湖南工程学院课程设计任务书课程名称课题专业班级纺织工程学生姓名学号指导老师审批任务书下达日期20xx...

c语言课程设计报告

C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体设计四详细设计五运行结果六课程设计体会一实验目的1通过课程设计加深对结构化程序设...

c语言课程设计+报告+源代码

西安郵電大學C语言课程设计报告题院系名称计算机学院专业名称班级学号8位指导教师设计起止时间20xx年06月03日20xx年06月12日一设计目的1通过本课程设计强化上机动手能力使学生在理论和实践的基础上进一步巩...

C语言课程设计报告

河南理工大学C程序设计报告C语言课程设计报告题目小学算术运算测试mathc设计者史前利专业班级通信工程1205学号31120xx20xx1指导教师刘洁所属系部计算机科学与技术20xx年07月03日河南理工大学河...

C课程设计报告—贪吃蛇

程序设计基础课程设计C课程设计报告贪吃蛇院系:计算机学院网络工程系班级:122班姓名:指导教师:20##年12月25日程序设计基础课程设计任务书一、题目:贪吃蛇二、设计要求(1)XXX负责设计与实现。(2)查阅…

C语言课程设计报告-游戏20xx

东华理工大学报告学院国际教育学院学院专业电子信息工程班级学号20xx20xx0638姓名钟天运一课程设计题目游戏20xx二课程设计要求a使用C语言编写20xx这款游戏b能够正常运行拥有游戏界面c能正常进行游戏从...

C语言课程设计报告(通讯录)

设计说明书通讯录系统起止日期20xx年01月03日至20xx年01月08日学班学成生姓名级号绩XXX指导教师签字计算机与通信学院20xx年01月08日一课题任务设计一个通讯录管理系统课题的主要任务是1对通讯录信...

C语言课程设计报告—人事管理系统

人事管理系统前言:现代计算机技术的发展为人们的学习、生活、工作提供了很大的帮助,各行各业都需要特定计算系统的运用,我们需要了解这些系统是怎么样为我们服务以及他们是怎样编辑出来的。我们需要学习C语言编程,根据课堂…

C语言课程设计报告书样本

海南大学三亚学院C语言程序设计课程设计贪吃蛇算法专业计算机科学与技术班级计科1001姓名杨凯文题目学号指导老师李春林目录C语言程序设计课程设计11程序要求32程序分析与设计33流程图44源程序清单45调试过程1...

C语言课程设计报告样本

C语言程序设计综合实验报告设计题目图书管理系统班级学号姓名指导教师梁国业起止时间20xx118至20xx22520xx20xx学年第一学期1设计任务该系统包含图书馆馆藏图书的信息供读者查询建立一个文件存放图书信...

c++课程设计报告(32篇)