用鼠标划线c实验报告.docx
《用鼠标划线c实验报告.docx》由会员分享,可在线阅读,更多相关《用鼠标划线c实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
用鼠标划线c实验报告
青岛理工大学
C++面向对象课程设计报告
院(系):
计算机工程学院
专业:
_计算机科学与技术
学生姓名:
班级:
_计算123__ 学号:
201207097
题目:
鼠标绘制曲线__
起迄日期:
____2014.6.23~2013.7.5
设计地点:
__计算机学院机房
指导教师:
____刘淑霞
完成日期:
2014年7月5日
目录
第一章绪论…………………………………………………………………………..1
1.1课题背景………….……………………………………………………...1
1.2国内外研究情况…………….…………………………………………...1
第二章需求分析……………………………………………………………………..3
2.1功能需求………………………………………………………………...3
2.2数据需求………………………………………………………………...3
第三章总体分析……………………………………………………………………..5
3.1系统总体结构框图……………………………………………………...5
第四章详细设计……………………………………………………………………..6
4.1类的关系图……………………………………………………………...6
4.3主要功能代码说明……………………………………………………...7
第五章系统使用说明书……………………………………………………...…….11
第六章结论…………………………………………………………………………15
第七章参考文献……………………………………………………………………16
第一章绪论
1.1课题背景、内容
绘图是现代人学习、工作中的不可缺少的一项,人们在工作学习中常常需要绘制一些图形,虽然在一些文档工具中可以实现图形绘制,但往往比较麻烦,并且不易学习,一般没学过相关知识的人是不会运用文档工具中的功能去实现简单图形绘制的,这样人们在工作、学习中往往会陷入困境。
简单的绘图工具可以给人们工作带来很大的方便。
利用绘图工具实现简单绘图,不仅简单易学,而且方便简洁。
本课题主要应用c++编程实现用鼠标能过绘制图形,并且实现存储简单图形的功能,在绘图过程中可以应用对话框进行简单的线型、宽度、色彩的换用。
1.2国内外研究情况
微软公司计算机系统自带的画图工具
AdobePhotoshopCS8.01绿色版精简版软件语言:
Photoshop是著名的图象处理软件,为美国ADOBE公司出品。
在修饰和处理摄影作品和绘画作品时,具有非常强大的功能
AdobeIllustratorCSv11AdobeIllustrator是一套被设计用来作输出及网页制作双方面用途、功能强大且完善的绘图软件包,这个专业的绘图程序整合了功能强大的向量绘图工具、完整的PostScript输出,并和Photoshop或其它Adobe家族的软件紧密地结合。
第10版增加了诸如Arc、矩型网格线(RectangularGrid)以及坐标网格线(PolarGrid)工具等新的绘图及自动化优点;增加编辑的灵活度以及标志(编辑主要的对象或图像复制)。
你可以运用笔刷及其它如合并、数据驱动坐标等在工具列上的创造工具,帮助你建立联结到数据库的样版。
新的Illustrator还提供更多的网络生产功能,包括裁切图像并支持可变动向量绘图档(SVG)增强。
FireworksMX2004
AutoCAD设计
CorelDRAW
三维动画软件3DStudio(3DS)。
它的全称是3-DimensionStudio,译成中文应该是“三维影像制作室”。
3DStudioMAX(以下简称MAX)是以3DS4.x为基础的升级版本,它以全新的Windows界面及更强大的功能展示在我们面前。
用MAX来制作三维动画就像是当一个大导演——一切的角色、道具、灯光、摄像机、场景(包括如云、雾、雪、闪电等特效场面)及配音、镜头的剪辑合成等等都任你来安排处理。
如果你是一位设计家,用MAX来设计产品模型的感觉就像是雕塑家和魔术师,复杂的模型几乎是在瞬间就奇迹般地建立起来了。
而用MAX修改创建的模型更是轻而易举的事,完全可以把宝贵的时间和精力集中用在使设计更加完美更加理想上。
无论是出于何种目的使用MAX,一定会充分体会到用计算机工作时的那种“工作就是玩,玩就是工作”的快感。
可以毫不夸张地说,哪里需要三维设计、哪里需要三维动画,哪里就需要MAX。
MAX适合于从事下列任何一种职业的专家或业余爱好者:
电影特技、立体和影视动画广告设计、工业设计、建筑和室内装潢设计、包装与装潢设计、三维游戏开发、软件开发程序员(制作软件片头)、教学多媒体演示制作、军事科学研究和物理、化学或生物化学研究以及所有对三维动画和立体造型感兴趣的广大电脑玩家等。
MAYA因其强大的功能在3D动画界造成巨大的影响,已经渗入到电影、广播电视、公司演示、游戏可视化等各个领域,且成为三维动画软件中的佼佼者。
《星球大战前传》、《透明人》、《黑客帝国》、《角斗士》、《完美风暴》、《恐龙》等到很多大片中的电脑特技镜头都是应用MAYA完成的。
逼真的角色动画、丰富的画笔,接近完美的毛发、衣服效果,不仅是影视广告公司对MAYA情有独钟,许多喜爱三维动画制作,并有志向影视电脑特技方向发展的朋友也为MAYA的强大功能所吸引。
第二章需求分析
2.1功能分析
本课题主要应用c++编程实现用鼠标能过绘制图形,并且实现存储简单图形的功能,在绘图过程中可以应用对话框进行简单的线型、宽度、色彩的换用。
2.2数据分析
(1)组成曲线的点的数目和组成曲线网络中曲线的数目事先无法确定,利用集合类来存放,可以动态改变集合的大小;
(2)我们需要把曲线网络的信息写到磁盘文件中,或需要从磁盘文件中读取曲线文件,集合类是个很好的选择,因为他们都是派生于CObject类,具有Serialize的特性;
(3)同时集合类又是模板类,所以在使用时需要指定具体的成员类型。
在使用CArray类时,指定其成员类型为CPoint类。
在使用CTypedPtrList类时,指定其基类为CObList,成员类型为CCurve*,其中CCurve将在下面详细说明。
曲线类定义
(1)类名称CCurve,头文件Curve.h,实现文件Curve.cpp。
(2)基类CObject,即类CCurve必须派生自CObject,使CCurve具有Serialize特征,为此类的声明文件(头文件)中必须有DECLARE_SERIAL宏,类的执行函数里必须有IMPLEMENT_SERIAL宏。
(3)设置构造函数,首先必须定义一个缺省的构造函数,即无参数的构造函数CCurve(),为什么?
因为若一个类来自文件,MFC必须先动态生成它的对象,而且在没有任何参数的情况下调用其构造函数,然后才从文档中读出对象信息。
另外,根据需要,可以添加其他形式的构造函数。
在这里,除了缺省的构造函数外,也添加了一个新的构造函数,其形式为CCurve(intnStyle,intnWidth,COLORREFcrColor),其中第一个参数为曲线的线型,曲线的线型主要有实线、短划线、点线、点划线和点点划线等,第二个参数为曲线的宽度,第三个参数为曲线的颜色,即通过这个构造函数设置曲线的线型、宽度和颜色。
(4)曲线文件的保存和打开。
在这里需要把一条曲改写文档类的虚拟函数Serialize,线的信息写入文件中或从文件中读取一个曲线的信息并显示。
写入或读取的曲线信息主要有线型、宽度、颜色和节点序列,这四种信息的写入和读取的顺序要相同。
由于节点序列是存放在CArrray类型的数组中,而该类型的数组本身具有序列化的特点,所以在写入或读取节点序列时,再调用CArrray的Serialize函数,完成一次性的写入或读取节点序列。
(5)曲线的绘制。
曲线的绘制分三步进行,第一步,根据曲线属性定义画笔,画笔的属性主要有:
线型、宽度和颜色,这些属性都可以通过对话框由用户选择;第二步把定义好的画笔选入设备环境中;第三步即可用定义好的画笔在具体的设备环境中画线。
(6)添加新的节点函数AddNewPoint。
鼠标每移动一下,都要调用该函数,把当前鼠标位置坐标添加到曲线类CCurve的节点序列中。
文档类
(1)曲线网络的定义m_curveList,采用模板链表类CTypedPtrList,该类的基类为CObList,即链表中的成员为CObject类对象,类型为CCurve*,为指向CCurve类的指针。
(2)曲线文件的读写Serialize,分三步进行:
第一步,由于CTypedPtrList派生自CObject,所以该类对象也具有序列化的特征,所以曲线文件的读写即完成该类对象的序列化操作就行了,即在文档类的Serialize函数直接调用CTypedPtrList类的Serialize函数;第二步,由于CTypedPtrList类的成员是CCurve类,所以需要继续调用CCurve类的Serialize函数,来完成各条曲线的序列化操作,即依次完成每条曲线的属性(包括线型、宽度和颜色)和节点序列的写入或读取;第三步,由于每条曲线的节点序列存放在CArray数组中,于是接着调用CArray类的Serialize函数完成节点序列的序列化操作。
(3)创建一条新的曲线函数NewCurve。
该函数实现创建一条新的曲线,并添加到曲线网络中,在这里利用new运算符创建一个CCurve类对象,即调用该类的带参数的构造函数,对象创建完毕,添加到曲线网络链表中。
(4)删除文档函数DeleteContents。
在打开新的文档,创建新的文档和程序结束时都要调用该函数,删除文档的内容,以释放已被占用的内存。
第三章总体设计
第四章详细设计
4.1
4.2
//鼠标左键摁下
voidCDrawLineView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
n_pstroke=(GetDocument()->NewCurve());
n_pstroke->n_pointArray.Add(point);//保存左键摁下后的点
n_atOrigin=point;
n_change=TRUE;
CView:
:
OnLButtonDown(nFlags,point);
}
//左键摁下后鼠标移动
voidCDrawLineView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CClientDCdc(this);
CPenpen(PS_SOLID,1,RGB(0,0,0));//PS_DASHPS_DOT
CPen*poldpen=dc.SelectObject(&pen);//选择当前画笔
if(n_change==TRUE)//判断左键是否摁下
{dc.MoveTo(n_atOrigin);
dc.LineTo(point);
n_atOrigin=point;
n_pstroke->n_pointArray.Add(point);//保存鼠标移动过程中的点
}
dc.SelectObject(poldpen);
CView:
:
OnMouseMove(nFlags,point);
}
//左键松开
voidCDrawLineView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
n_change=FALSE;
n_pstroke->n_pointArray.Add(point);//保存终止点
CView:
:
OnLButtonUp(nFlags,point);
}
这三部实现啦画线
classCCurve:
publicCObject
{
public:
CCurve();
virtual~CCurve();
public:
CArrayn_pointArray;//记录数组里的点
voidDrawStroke(CDC*pDC);
public:
virtualvoidSerialize(CArchive&ar);
DECLARE_SERIAL(CCurve)
};
voidCDrawLineView:
:
OnDraw(CDC*pDC)
{
CDrawLineDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
POSITIONpos=pDoc->n_strokeList.GetHeadPosition();
while(pos!
=NULL)
{
CCurve*pStroke=pDoc->n_strokeList.GetNext(pos);
pStroke->DrawStroke(pDC);
n_pstroke->DrawStroke(pDC);
}
CCurve*CDrawLineDoc:
:
NewCurve()
{
CCurve*pStroke=newCCurve;
n_strokeList.AddTail(pStroke);
SetModifiedFlag();
returnpStroke;
}
线条设置代码
voidCCurveView:
:
OnSeting()//设置画笔的属性
{
Setingdlg;
dlg.m_nLineWidth=m_nLineWidth;
dlg.m_nLineStyle=m_nLineStyle;
dlg.m_color=m_clr;
if(IDOK==dlg.DoModal())
{
m_nLineWidth=dlg.m_nLineWidth;
m_nLineStyle=dlg.m_nLineStyle;
m_clr=dlg.m_color;
}
}
第五章系统使用说明书
运行程序后摁住左键画线
通过修改数据让线条变成红色,宽度变为10
线条为点线
存储线条
打开文件
打开后
第六章结论
通过这次课程设计,让我第一次认识啦c++的语言的强大简洁,第一次接触mfc,对制作一个画图软件感觉无从下手,看啦很多的视频教程后,还是觉得对MFC不了解,他把每部分分开,有时候找个变量都觉得很困难,在询问拉同学和通过网络搜索后,通过一步步的修改,最终还是把程序做出来啦,程序还有很多弊端。
最初,做出来的程序只能画出一条线,无论你画多少条,再最小化以后都是一条,最后通过XX后终于知道自己定义变量不对,然后就是线段无法保存,当保存完后打开总是空的,原来在保存程序中忘记加保存点,颜色值为红、绿、蓝三色的混合,最小值为0,即黑色,RGB(0,0,0),最大值为16777215,RGB(255,255,255),即白色,可以通过颜色对话框选择。
最后就是对话框,我搜索啦好久也没找到一个教程,找同学帮忙后总算做出来啦,但是还是不能打开。
只能通过在程序里改cpen来修改啦。
还有就是点线和虚线在保存时都会变为实线。
还有一个小问题是点线和虚线只能用线宽1时才能画出。
这个程序还是能够实现画图和保存图的功能的。
这次课程设计让我学到啦很多,也对MFC有啦初步的认识,在以后的学习中我一定能把上面的问题一个一个解决的。
第七章参考文献
【1】李兰C++面向对象课程设计西安电子科技大学出版社2010
【2】李兰C++面向对象课程设计实验指导西安电子科技大学出版社2010
【4】孙鑫MFC视频教学搜狐视频