您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > windows编程技术14GDI+编程基础
1第14章GDI+编程基础GDI+(GraphicsDeviceInterfacePlus,图形设备接口加)是WindowsXP及以上版本操作系统的图形子系统,也是传统.NET框架的重要组成部分和窗体绘图的主要工具,负责在屏幕和打印机上绘制图形图像和显示信息。顾名思义,GDI+是Windows早期版本所提供的图形设备接口GDI的后续版本,是建立在GDI之上的一个高层图形子系统。GDI+是一种API,分别通过一套C++类和一套部署为托管代码的类来展现,这两套类分别被称为GDI+的“C++封装”和“托管类接口”。GDI+不但在功能上比GDI要强大很多,而且在代码编写方面也更简单,因此会成为Windows图形图像程序开发的主要工具之一。由于篇幅所限,本书只简单介绍利用MFC进行GDI+编程的一些基本内容,也不讲GDI+的API编程。基于GDI+托管封装的.NET窗体绘图,将在第18章中再介绍。对GDI+编程有兴趣的读者,可以参考如下图书:周鸣杨、赵景亮.精通GDI+编程.清华大学出版社,2004年2月(C++/MFC)。MaheshChand(韩江等译).GDI+图形程序设计.电子工业出版社,2005年3月(C#/.NET)。本章将介绍GDI+的结构和组成,讨论GDI+的几个主要新增特性与功能,说明GDI+给Windows图形图像程序的开发模式带来的变化。介绍C++封装的GDI+API的具体使用方法,主要讲解二维矢量图形绘制和文字显示等基本内容。GDI+的路径、区域、变换、图像处理和图元文件等高级编程内容,安排在下一章介绍。14.1GDI+的结构与组成本节先介绍GDI+的体系结构,再列出C++封装的GDI+API的具体组成。14.1.1GDI+的结构GDI+是建立在GDI之上的一种高层图形子系统,基础是GDI+平面API,有C++和托管两种封装。注意,虽然GDI+是GDI的发展,但是GDI+并非设计来替代GDI的,它不能独立工作,底层还得靠GDI实现。21.GDI+的体系结构GDI+与GDI一样,都具有设备无关性。而且GDI+是建立在GDI之上的一种高层接口,供WindowsAPI和.NET框架调用。与GDI类似,GDI+主要提供了二维矢量图形、图像处理和文字显示版式三类功能(参见图14-1),只是GDI+比GDI的功能更强大,且编程模式发生了改变。图14-1GDI+的体系结构2.GDI+平面API与封装GDI+提供(expose)了一个平面(flat)API,它包含大约600个函数,被实现在Gdiplus.dll中,声明在Gdiplusflat.h内。这些函数被包装到了前面讨论过的GDI+API的54个C++类的集合之中。作为C++封装的替代方案,微软.NET框架提供了GDI+的一个托管代码封装类集,包含大约60个类、50个枚举和8个结构。它们分属于下列命名空间:System.Drawing、System.Drawing.Drawing2D、System.Drawing.Imaging、System.Drawing.Text和System.Drawing.Printing。GDI+的平面API与其C++及托管封装的关系如图14-2所示。设备驱动程序计算机硬件GDI+引擎GDI二维矢量图形图像文字.NET框架Win32/64(C++)3图14-2GDI+的封装与使用14.1.2GDI+的组成GDI+的C++封装,包含了54个类、12个全局函数、(6类)226个图像常量、55种枚举和19种结构。GDI+的.NET托管封装,则包含了大约60个类、50个枚举和8个结构。这两种封装都是基于GDI+平面API的。本小节只介绍GDI+的C++封装,GDI+的托管封装将在第18章的.NET窗体绘图中有所涉及。1.类GDI+的C++封装中共有54个类,核心类是Graphics,它是实际绘制直线、曲线、图形、图像和文本的类。许多其它GDI+类是与Graphics类一起使用的。例如,DrawLine方法接收Pen对象,该对象中存有所要绘制的线条的属性(颜色、宽度、虚线线型等)。FillRectangle方法可以接收指向LinearGradientBrush对象的指针,该对象与Graphics对象配合工作来用一种渐变色填充矩形。Font和StringFormat对象影响Graphics对象绘制文本的方式。Matrix对象存储并操作Graphics对象的仿射变换——旋转、缩放和翻转图像。GDI+还提供了用于组织图形数据的几种结构类(例如Rect、Point和Size)。而且,某些类的主要作用是结构化数据类型。例如,BitmapData类是Bitmap类的帮助器,PathData类是GraphicsPath类的帮助器。图14-3是GDI+API类的层次结构图。注意:在GDI+、.NET、C#、Java和VB中,都把类的成员函数称为方法。当我们在C++中,使用GDI+和.NET框架类库中的类和功能时,也常常将其函数改称为方法。DllExportsSystem.Drawing[.dll]GdiplusGdiplus.hafxwin.hC++封装(MFC)C++封装托管代码封装设备驱动程序计算机硬件(显示器、打印机等图形设备)GDIAPIGDI+平面APIC++C#、VB、F#GDI+APIGDI+托管类接口GDI类与结构Gdi32.dllWinGDI.hGdiplus.dllGdiplusFlat.h4图14-3GDI+类的层次结构2.全局函数GDI+命名空间中的全局函数有12个,常用的有如下两个(其余的大多数与图像相关):关闭GDI+:GdiplusShutdown(清除GDI+所使用的资源)。启动GDI+:GdiplusStartup(初始化GDI+)。GdiplusBaseGraphicsGraphicsPathGraphicsPathIteratorPenBrushSolidBrushHatchBrushTextureBrushLinearGradientBrushPathGradientBrushImageBitmapMetafileCustomLineCapAdjustableArrowCapCachedBitmapImageAttributesFontCollectionInstalledFontCollectionPrivateFontCollectionStringFormatRegionFontFontFamilyMatrixPointPointFSizeSizeFRectRectFColorEffectBlurBrightnessContrastColorBalanceColorCurveColorLUTColorMatrixEffectHueSaturationLightnessLevelsRedEyeCorrectionSharpenTintImageItemDataBitmapDataMetafileHeaderPropertyItemEncoderParameterEncoderParametersImageCodecInfoPathDataCharacterRange独立类绘图类效果类53.常量、枚举和结构GDI+中有6类共计226个图像常量(都被定义在头文件GdiplusImaging.h中),包括图像文件格式常量11个(如ImageFormatBMP、ImageFormatGIF、ImageFormatJPEG、ImageFormatPNG、ImageFormatTIFF等)、图像帧维常量2个、图像编码器常量13个、图像像素格式常量14个、图像特性标志类型9个、图像特性标志217个。GDI+定义了55种枚举类型,它们都是相关常数的集合。例如:PenType、BrushType、DashStyle、ImageType、LineCap、FillMode、ImageFlags等。GDI+API中还定义了19种结构,用于GDI+的各种方法调用中。例如:ColorMap、ColorMatrix、ColorPalette、GdiplusAbort、GdiplusStartupInput、GdiplusStartupOutput等。14.2GDI+的特色本节介绍GDI+的几个主要新增特性与功能,说明GDI+在编程模式上的改变。14.2.1GDI+新增特性与GDI相比,GDI+新增的特性主要有渐变画刷、样条和贝塞尔曲线、持久路径、矩阵变换、伸缩区域、α混色和对多种图像格式的支持。1.渐变画刷GDI+中新增加的渐变画刷(gradientbrush,梯度刷),通过提供用于填充图形、路径和区域的颜色线性渐变和路径渐变的画刷,扩展了GDI的功能。渐变画刷可用于绘制直线、曲线和路径,参见图14-4。a)(水平)线性渐变b)(贝塞尔)路径渐变图14-4渐变画刷图14-5基样条曲线与折线62.曲线方法GDI+支持基样条(cardinalsplines)和贝塞尔(Bezier)方法,可以由若干控制点生成光滑的曲线,参见图14-5。3.持久路径对象GDI中的路径(path)属于设备上下文,并且会在绘制时被毁坏。而GDI+则可以创建并维护多个与Graphics对象分开的持久(persistent)路径对象——GraphicsPath对象,在绘图操作时也不会破坏,因此可多次使用同一个GraphicsPath对象来绘制路径。4.变换和矩阵对象GDI+提供了Matrix(矩阵)对象,它是一种可以使(缩放、旋转和平移等)变换(transformation)简易灵活的强大工具,矩阵对象一般与变换对象联合使用。例如,GraphicsPath对象具有Transform方法,此方法接收Matrix对象作为参数。参见图14-6。5.可伸缩区域GDI+通过对可伸缩区域(scalableregion)的支持极大地扩展了GDI。在GDI中,区域被存储在设备坐标中,而且,可应用于区域的惟一变换是平移。而GDI+在全局坐标中存储区域,并且允许区域发生任何可存储在变换矩阵中的变换(如缩放和旋转)。图14-7显示一个区域在执行三种变换(缩放、旋转和平移)前后的情况。图14-6路径变换图14-7区域变换图14-8不同透明度6.α混色在图14-7中,可以在变换区域(用蓝色阴影画笔填充)中看到未变换区域(用红色填7充),这是由GDI+支持的α混色(alphablending,透明混合)实现的。使用α混色,可以指定填充颜色的透明度。透明色与背景色相混合———填充色越透明,透出的背景色就越多。图14-8显示四个用相同颜色(红色)填充、但透明层次不同的椭圆。7.丰富的图像格式支持GDI+提供Image、Bitmap和Metafile类,可以用不同的格式加载、保存和操作图像。GDI+支持BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF共9种常见的图像格式。这些已经被ATL/MFC中的基于GDI+的CImage类所体现。8.GDI+的不足虽然,相对于GDI来说,GDI+确实增加了许多新特性,而且功能更强大,使用也更方便。但是,这并不等于GDI+就能够完全代替GDI。因为GDI+实际上是GDI的高层封装和功能扩展,GDI+的执行效率一般要低于GDI的。另外,GDI+不支持图形的位运算,那么就不能进行异或绘图等操作。而且在VisualC++中,GDI+还不直接支持双缓存机制(如内存DC和显示DC),这将大大影响GDI+在高速图形、图像、动画和视频等方面的应用。14.2.2编程模式的改变GDI+的出现,也使基于GDI的编程模式产生了很大变化:GDI+用一个“无状态模式”,取代了GDI中(需要先将各种工具和项目选入DC对象后,才能进行绘图的)“状态模式”。主要体现在以下几个方面:1.DC句柄和图形对象设备上下文(DC)是GDI中使用的一种结构,用于存储与特定显示设备相关的的绘制工具及属性的信息,用于屏幕显示的DC还与特定窗口相关联。为了使用GDIAPI进行绘图,
本文标题:windows编程技术14GDI+编程基础
链接地址:https://www.777doc.com/doc-6158336 .html