基于vc的线条类设计.docx
- 文档编号:16589229
- 上传时间:2023-07-15
- 格式:DOCX
- 页数:33
- 大小:424.38KB
基于vc的线条类设计.docx
《基于vc的线条类设计.docx》由会员分享,可在线阅读,更多相关《基于vc的线条类设计.docx(33页珍藏版)》请在冰点文库上搜索。
基于vc的线条类设计
摘要
本文主要介绍了一个简单的绘图软件的详细设计方法和过程。
它是我们大学生毕业前的一次考验。
它能实现一个简单的用户界面,并能实现几个基本的图元的移动,删除和改变颜色。
它的设计方法是利用MAC工程中的GDI(GraphicsDeviceInterface)类库函数来实现画图的。
该软件的基本功能包括基本图形绘制,更改图元绘制条件(改变图元颜色),删除图元等。
要求:
实现所见即所得绘图功能;实现图元的插入功能;实现图形文件的存储功能。
该软件是基于MAC实现的,在文本框的基础上实现绘图功能。
能通过程序设计以达到提高VC++的编程水平的目的。
随着社会的不断进步,人们对图形的要求越来越高,因此我们有必要掌握好图形的绘制,虽然本软件知识一个十分简单的软件。
但我们应该不断的学习,以便将来更好的适应发展。
关键词:
MFC,图元,文本框
Abstract
Thispaperdescribesasimplemethodofmappingsoftwareandprocessthedetaileddesign.Itisatestforstudentsbeforegraduation.Itcanimplementasimpleuserinterface,andcanachieveafewbasicprimitivemove,deleteandchangecolor.ItsdesignistouseMACProjectGDI(GraphicsDeviceInterface)functiontoimplementdrawinglibrary朗读
显示对应的拉丁字符的拼音
字典
Thesoftware'sbasicfunctions,includingbasicgraphicsrendering,changeprimitiveplancondition(changelinecolor).Request:
Realizesseesnamelytheobtainedcartographyfunction;Realizesprimitiveinsertion;Realizesthegraphicfilememoryfunction.ThesoftwareisbasedontheMACimplementation.Inthetextboxbasedonthegraphics.CantheprogrammingachieveenhancesVC++theprogramminglevelgoal.
Associetyprogresses,peoplebecomeincreasinglydemandingonthegraphics,andweneedtomasterthedrawing,althoughthesoftwareknowledgeaverysimplesoftware.Butweshouldkeeplearninginordertobetteradapttofuturedevelopment.
Keyword:
MFC,primitive,textbox
1前言
1.1课题背景
计算机图形技术是随着计算机技术在图形处理领域中的应用而发展起来的一门新技术,是伴随着电子计算机及其外围设备的发展而产生的,现已成为计算机应用科学中的一个重要分支,在许多行业中起着越来越大的作用。
计算机的运算能力的提高,图形处理速度的加快,使得图形学的各个研究方向得到充分发展,大量价格低、简单易用的图形应用程序促使具有图形处理功能的计算机进入家庭。
图形学已广泛应用于计算机辅助设计与制造、计算机动画、科学计算可视化、虚拟现实、影视娱乐等各个领域。
这必然促使计算机专业人员、广大非计算机专业的应用人员,从计算机图形学的理论高度和计算机绘图的实用角度来研究和开发计算机图形的生成技术及软件。
计算机图形学的原理和算法是开发图形软件的基础,对高级语言中绘图工具的掌握是理解和应用计算机图形理论的翅膀。
只有扎实的计算机图形学理论基础,才能开发图形软件;必须灵活运用高级语言中的绘图能力才能开发出优质的图形软件。
因此,我也必须要花费大量的时间学习掌握计算机图形学相关算法知识。
随着操作系统不断的更新换代,其自带的画图板界面及功能也是不断变化着的。
像是XP(WindowsXP)、vista(WindowsVista)、Win7(Windows7),它们的画图板的界面布局风格以及功能都有所不同。
Vista较XP,把颜色选择按钮放在了画板的上面,其它的基本上没太大变化,这样整体就显得整齐多了。
而Win7把左边的图像选择按钮也放在了画板的上方,这样更加的一目了然。
这表明,尽管是简简单单的一个操作系统自带画图板,系统设计人员也没有停止对它的不断研究与探索,他们在不断寻找着更人性化、更能满足大众需求的改变。
1.2VisualC++简介
VC++6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C++语言的要求编写,并加入了微软提供的功能强大的MFC(MicrosoftFoundationClass)类库。
MFC中封装了大部分WindowsAPI函数和Windows控件,它包含的功能涉及到整个Windows操作系统。
MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。
另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。
因此,使用VC++提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。
1.3目的和内容
进入新世纪,随着科学技术的不断发展,计算机已经成为人们生活中不可缺少的一部分。
人们把计算机运用于各行各业,让它充分发挥作用,给我们的生产、生活带来许多便利。
作为21世纪计算机专业的大学生,我们的任务就是要用所学的理论知识创作出更多更人性化的软件,为现代生产、生活做贡献,方便广大计算机用户。
随着社会的不断发展以及计算机的不断普及,人们对画面的要求越高,对画图工具也提出了更高更全面的要求。
许多用户由于自身的画图习惯或者是视觉效果不同,对传统的画图工具可能感觉不是特别满意。
就像孩子总是喜欢界面做成可爱型的,而成人则希望界面正式且实用的,而老年人却是喜欢界面整齐简单明了的。
不同年龄不同身份的人,需求不同。
综合上述,为了尽量让所有人满意,在此我设计了一个简单的绘图程序,希望能一次为基础来设计更加合理的绘图软件,已满足大家的需求。
我们在学完VC++以后,为了更好的掌握和运用所学内容,完成了这个画图软件的制作,在这篇论文中我将详细向读者介绍一下我的设计思路和整个设计方法。
本课题主要研究是怎样基于MFC工程来制作简单的绘图软件。
1.4课题技术关键
本课题的关键技术是基于MFC的类库基础上调用GDI函数实现各种图元的插入,并实现移动、删除和改变颜色。
要求对MFC类库和GDI函数比较熟悉,并能正确运用。
2VC++中MFC介绍
2.1MFC基本概念
2.1.1MFC简介
MFC(MicrosoftFoundationClassLibrary)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
MicrosoftVisualC++提供了相应的工具来完成这个工作:
AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
图2-1 VC++创建工程界面
2.1.2封装
构成MFC框架的是MFC类库。
MFC类库是C++类库。
这些类或者封装了Win32应用程序编程接口(API),或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下:
(1)对Win32应用程序编程接口的封装
用一个C++Object来包装一个WindowsObject。
例如:
classCWnd是一个C++windowobject,它把Windowswindow(HWND)和Windowswindow有关的API函数封装在C++windowobject的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。
(2)对应用程序概念的封装
使用SDK编写Windows应用程序时,总要定义窗口过程,登记WindowsClass,创建窗口,等等。
MFC把许多类似的处理封装起来,替程序员完成这些工作。
另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。
文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。
(3)对COM/OLE特性的封装
OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。
MFC的OLE类封装了OLEAPI大量的复杂工作,这些类提供了实现OLE的更高级接口。
(4)对ODBC功能的封装
以少量的能提供与ODBC之间更高级接口的C++类,封装了ODBCAPI的大量的复杂的工作,提供了一种数据库编程模式。
2.1.3继承
首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。
这些类中,最重要的类是CObject和CCmdTarget。
CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。
CObject实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。
所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。
CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。
MFC中,任何可以处理消息的类都从CCmdTarget派生。
针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。
这些对象包括以下种类:
窗口对象,基类是CWnd;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。
程序员将结合自己的实际,从适当的MFC类中派生出自己的类,实现特定的功能,达到自己的编程目的。
2.1.4GDI+简介
GDI+是MicrosoftWindowsXP操作系统的组成部分,它提供了二维矢量图形、图像处理和版式。
通过添加新功能和优化现有功能,GDI+对GDIGraphicsDriverInterface(Windows早期版本提供的图形设备接口)进行了改进。
程序员可利用它来编写设备无关的应用程序。
GDI+的服务分为三大类:
第一类是二维矢量图形。
矢量图形包括坐标系统中的系列点指定的绘图基元(例如,直线、曲线和图形)。
例如,直线可通过它的两个端点来指定,而矩形可通过确定其左上角位置的点并给出其宽度和高度的一对数字来指定。
简单路径可由通过直线连接的点的数组来指定。
贝塞尔样条是由四个控制点指定的复杂曲线。
GDI+提供了存储基元自身相关信息的类(和结构)、存储基元绘制方式相关信息的类,以及实际进行绘制的类。
例如,Rectangle结构存储矩形的位置和尺寸;Pen类存储有关线条颜色、线条粗细和线型的信息;而Graphics类具有用于绘制直线、矩形、路径和其他图形的方法。
还有几种Brush类,它们存储有关如何使用颜色或图案来填充封闭图形和路径的信息。
您可以在图元文件中记录矢量图像(图形命令的序列)。
GDI+提供了Metafile类,可用于记录、显示和保存图元文件。
MetafileHeader和MetaHeader类允许您检查图元文件头中存储的数据。
第二类是图像处理。
某些种类的图片很难或者根本无法用矢量图形技术来显示。
例如,工具栏按钮上的图片和显示为图标的图片就难以指定为直线和曲线的集合。
拥挤的棒球运动场的高分辨率数字照片会更难以使用矢量技术来制作。
这种类型的图像可存储为位图,即代表屏幕上单个点颜色的数字数组。
GDI+提供了Bitmap类,可用于显示、操作和保存位图。
第三类是版式。
版式关系到使用各种字体、字号和样式来显示文本。
GDI+为这种复杂任务提供了大量的支持。
GDI+中的新功能之一是子像素消除锯齿,它可以使文本在LCD屏幕上呈现时显得比较平滑。
GDI+托管类接口是Microsoft.NETFramework的组成部分,包含大约60个类、50个枚举和8个结构。
Graphics类是GDI+的核心功能,它是实际绘制直线、曲线、图形、图像和文本的类。
许多类与Graphics类一起使用。
例如,Graphics.DrawLine方法接收Pen对象,该对象中存有所要绘制的线条的属性(颜色、宽度、虚线线型和外观)。
Graphics.FillRectangle方法可以接收指向LinearGradientBrush对象(它使用Graphics对象以渐变色填充矩形)的指针。
Font和StringFormat对象影响Graphics对象绘制文本的方式。
Matrix对象存储并操作Graphics对象的全局变形,该对象用于旋转、缩放和翻转图像。
GDI+为组织图形数据提供了几种结构(例如,Rectangle、Point和Size)。
而且,某些类的主要作用是结构化数据类型。
例如,BitmapData类是Bitmap类的助手,而PathData类是GraphicsPath类的助手。
GDI+定义了几种枚举,它们是相关常量的集合。
例如,LineJoin枚举包含元素Bevel、Miter和Round,它们指定可用于连接两个线条的样式。
2.2MFC部分函数简介
类CObject(派生类CMenu、AssertValid):
函数原型:
virtualvoidAssertValid()const;
函数功能:
提供对对象内部状态的运行时检查。
虽然在从CObject派生类时不要求重写AssertValid,但是这样做可以使类更加可靠。
AssertValid应该对所有对象的成员变量执行断言,以验证它们包含的值是否有效,当重写AssertValid时,在执行您自己的检查之前请调用AssertValid的基类版本。
然后使用ASSERT宏检查您的派生类特有的成员。
Dump:
函数原型:
virtualvoidDump(CDumpContext&dc)const;
函数功能:
通过重载Dump(CDumpContext&dc)函数,可以向输出窗口输出信息,大部分输出信息都是由一个全局对象CDumpContextafxDump提供,因为afxDump是全局对象,你在任何MFC程序的任何CObject的派生类中都可以操作它。
CDumpContext的构造函数关联了一个文件类,MFC自己会往里面写入很多信息,dc指针指向全局对象afxDump。
IsSerializable:
函数原型:
BOOLIsSerializable()const;
函数功能:
测试对象是否已被串行化(序列化)。
序列化是将对象状态转换为可保持或传输的格式的过程。
与序列化相对的是反序列化,它将流转换为对象这两个过程结合起来,可以轻松地存储和传输数据。
序列化的目的:
(1)以某种存储形式使自定义对象持久化;
(2)将对象从一个地方传递到另一个地方。
框架窗体:
CWnd
Attachp50
CalcWindowRectp51
Createp51
CreateControlp52
CreateExp53
CalcWindowRect
函数原型:
voidCalcWindowRect(LPRECTlpClientRect,UINTnAdjustType
=adjustBorder)。
函数功能:
调用这个成员函数以根据所需的客户矩形大小计算窗口矩形的大小。
参数:
lpClientRect:
指向一个RECT结构或CRect对象,其中包含了窗口矩形的值。
nAdjustType:
用于现场编辑的枚举类型。
它可以具有以下的值:
CWnd:
:
adjustBorder=0,意味着在计算时不考虑滚动条大小;或者CWnd:
:
adjustBorder=1,意味着它们将被加入最终的矩形大小。
ClientToScreen:
函数原型:
voidClientToScreen(LPPOINTlpPoint)const;voidClient
ToScreen(LPRECTlpRect)const;
参数:
lpPoint:
指向一个含有要转换的用户坐标的Point结构的指针,如果函数调用成功,新屏幕坐标复制到此结构。
lpRect:
指向一个含有要转换的用户坐标的Rect结构的指针,如果函数调用成功,新屏幕坐标复制到此结构。
ActivateFrame:
函数原型:
voidActivateFrame(intnCmdShow=-1);
函数功能:
主要用于框架的显示方式。
3程序功能设计
3.1总体设计
3.1.1流程分析
图3-1 软件功能流程图
3.1.2功能框架结构
(1)软件的框架主要是先设计菜单栏的绘图生成工具栏以进行下一步的操作。
(2)然后就是工具栏中的按钮函数定义与实现。
(3)只要能够实现按钮与函数的映射,那么这些功能基本都可以实现。
3.2程序功能模块
绘图应用程序中,我们将实现一般绘图应用程序所具有的绝大多数功能,并提供一些额外的辅助功能。
具体而言,其实现的功能主要包括如下方面。
3.2.1绘制图元
可以通过绘图工具栏绘制下列图元:
直线段图元,用户可以使用鼠标随意改变直线段位置。
直线箭头图元,允许用户拖动鼠标随意改变箭头的位置。
波浪箭头图元,使用鼠标控制波浪箭头的位置。
3.2.2改变绘制条件
在绘制图元时,还可使用图元属性页对图元的属性进行修改,主要是各种图元的颜色。
3.2.3文件持久性
对于应用程序来说文件的持久性十分重要,要不能保证这一点,应用程序就很难说有什么存在价值。
本应用程序能够完成图形文件的保存、打开、打印功能。
4系统功能实现
4.1建立MFC工程
图4-1 工程颜色绘画
(1)建一个单文档SDI应用程序,名为:
颜色绘图。
如图4-1:
(2)在查看的下面建菜单:
ID_COLORS_MENU名为:
绘画。
如图4-2:
(3)加工具栏按钮,为改变颜色、画直线段、箭头、波浪箭头。
加工具条按钮的步骤如下:
ResourceView右键击ToolbarInsertToolbarNew出工具条加上一个按钮:
将ID改为:
(直线)ID_BUTTONLINE。
之后再双击后面的空白按钮,逐个将下面的按钮加上去,并改ID为:
(箭头)ID_BUTTON_ARROWLINE
(线段)ID_BUTTON_LINE
(波浪箭头)ID_BUTTON_DOTARROWLINE
(调换颜色)ID_BUTTON_CHANGECOLOR
图4-2 绘画菜单
图4-3工具栏
(删除)ID_BUTTON_DELETE
注意:
将此工具栏本身的ID改为:
IDR_MYTOOLBAR。
如图4-3:
4.2实现按钮映射
(1)加鼠标映射(分别映射到视图View里)
鼠标按下LBUTTONDOWN鼠标抬起LBUTTONU鼠标移动MOUSEMOVE。
如图4-4
图4-4鼠标映射设置
(2)在视图头文件(View.h)里加:
afx_msgvoidOnChangeColor();
afx_msgvoidOnDelete();
afx_msgvoidOnLine();
afx_msgvoidOnArrowLine();
afx_msgvoidOnWaveLine();
自定义按钮的消息映射。
(3)在视图执行文件(View.cpp)里加:
ON_COMMAND(ID_BUTTON_CHANGECOLOR,OnChangeColor)
ON_COMMAND(ID_BUTTON_DELETE,OnDelete)
ON_COMMAND(ID_BUTTON_LINE,OnLine)//直线
ON_COMMAND(ID_BUTTON_ARROWLINE,OnArrowLine)//只限箭头
ON_COMMAND(ID_BUTTON_WAVELINE,OnWaveLine)//波浪线
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
//位图按钮消息映射函数
(4)在视图Wiew.h头文件的public:
下加成员变量和函数定义:
CDrawObject*m_pDrawobject[100];
intm_nObjectNum;
CSizem_sizeOffset;
BOOLm_bCapture;
BOOLm_bSelect;
CPointptDraw[20];
CPointStarPoint;
COLORREFm_clr;
(5)在视图View.cpp的开头部分加以下代码:
voidCMyView:
:
OnLine()
{
m_pDrawobject[m_nObjectNum]=newCDrawBasicLineObject_Line;
for(intk=0;k
{
m_pDrawobject[m_nObjectNum]->m_pt1[k]
=m_pDrawobject[m_nObjectNum]->m_pt[k];
}
++m_nObjectNum;
Invalidate(FALSE);
}
voidCMyView:
:
OnArrowLine()
{
m_pDrawobject[m_nObjectNum]=new
CDrawBasicLineObject_ArrowLine;
for(intk=0;k
{
m_pDrawobject[m_nObjectNum]->m_pt1[k]
=m_pDrawobject[m_nObjectNum]->m_pt[k];
}
++m_nObjectNum;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 vc 线条 设计