GDI+编程小结(一) 下载本文

内容发布更新时间 : 2024/11/8 18:35:06星期一 下面是文章的全部内容请认真阅读。

http://www.mybdqn.com/

GDI+编程小结

GDI+(GraphicsDeviceInterfacePlus图形设备接口加)是WindowsXP和WindowsServer2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。

GDI+不但在功能上比GDI要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选。

一、GDI+的特点和新增功能

GDI+与GDI一样,都具有设备无关性。应用程序的程序员可利用GDI+这样的图形设备接口在屏幕或打印机上显示信息,而不需要考虑特定显示设备的具体情况。应用程序的程序员调用GDI+类提供的方法,而这些方法又反过来相应地调用特定的设备驱动程序。GDI+将应用程序与图形硬件隔离,而正是这种隔离允许开发人员创建设备无关的应用程序。

1、GDI+的功能

GDI+主要提供了以下三种功能: 1)二维矢量图形

矢量图形包括坐标系统中的系列点指定的绘图基元(如直线、曲线和图形)。例如,直线可通过它的两个端点来指定,而矩形可通过确定其左上角位置的点并给出其宽度和高度的一对数字来指定。简单路径可由通过直线连接的点的数组来指定。贝塞尔样条是由四个控制点指定的复杂曲线。 GDI+提供了存储基元自身相关信息的类(结构)、存储基元绘制方式相关信息的类,以及实际进行绘制的类。例如,Rectangle结构存储矩形的位置和尺寸;Pen类存储有关线条颜色、线条粗细和线型的信息;而Graphics类具有用于绘制直线、矩形、路径和其它图形的方法(类似于GDI中的CDC类)。还有几种Brush类,它们存储有关如何使用颜色或图案来填充封闭图形和路径的信息。

用户可以在图元文件中记录矢量图像(图形命令的序列)。GDI+提供了Metafile类,可用于记录、显示和保存图元文件。MetafileHeader和MetaHeader类允许您检查图元文件头中存储的数据。 2)图像处理

某些种类的图片很难或者根本无法用矢量图形技术来显示。例如,工具栏按钮上的图片和显示为图标的图片就难以指定为直线和曲线的集合。拥挤的棒球运动场的高分辨率数字照片会更难以使用矢量技术来制作。这种类型的图像可存储为位图,即代表屏幕上单个点颜色的数字数组。

GDI+提供了Image、Bitmap和Metafile类,可用于显示、操作和保存位图。它们支持众多的图像文件格式,还可以进行多种图像处理的操作。 3)文字显示版式

就是使用各种字体、字号和样式来显示文本。GDI+为这种复杂任务提供了大量的支持。GDI+中的新功能之一是子像素消除锯齿,它可以使文本在LCD屏幕上呈现时显得比较平滑。

2、GDI+新增特性 1)、渐变画刷

渐变画刷(gradientbrush梯度刷)通过提供用于填充图形、路径和区域的线性渐变画笔和路径渐变画笔,GDI+扩展了GDI的功能。渐变画笔还可用于绘制直线、曲线和路径。线性渐变画笔可用于使用颜色来填充图形,画笔在图形中移动时,颜色会逐渐改变。例如,假定通过指定图形左边为蓝色、右边为绿色,创建了一个水平渐变画笔。当用水平渐变画笔填充该图形时,随着画笔从图形的左边移至右边,颜色就会由蓝色逐渐变为绿色。用类似方法定义的垂直渐变画笔填充的图形,颜色从上到下变化。图显示了用水平渐变画笔填充的椭圆和用斜式渐变画笔填充的区域。

图水平和斜式渐变画笔

用路径渐变画笔填充图形时,可选择不同的方法来指定当从图形的一部分至另一部分移动画笔时颜色的变化方式。一种选择是指定中心颜色和边缘颜色,在从图形中间向外边缘移动画笔时,像素逐渐从一种颜色变化到另一种颜色。图显示

http://www.mybdqn.com/

了用路径渐变画笔填充的路径(该路径是用一对贝塞尔样条创建的)。

图路径渐变画笔 2)、基数样条函数

GDI+支持在GDI中不支持的基数样条(cardinalspines)。基数样条是一连串单独的曲线,这些曲线连接起来形成一条较长的光滑曲线。样条由点的数组指定,并通过该数组中的每一个点。基数样条平滑地(没有锐角)通过数组中的每一个点,因此,比通过连接直线创建的路径更光滑精准。图显示了两个路径:一个以基数样条的形式创建;另一个通过连接直线创建。

图基数样条路径和折线路径 3)、持久路径对象

在GDI中,路径属于设备上下文,并且会在绘制时被毁坏。利用GDI+,绘图由Graphics对象执行,可以创建并维护几个与Graphics对象分开的持久的路径对象(persistentpathobject)——GraphicsPath对象。绘图操作不会破坏GraphicsPath对象,因此可以多次使用同一个GraphicsPath对象来绘制路径。 4)、变换和矩阵对象

GDI+提供了Matrix(矩阵)对象,它是一种可以使(缩放、旋转和平移等)变换(transformation)简易灵活的强大工具。矩阵对象一般与变换对象联合使用。例如,GraphicsPath对象具有Transform方法,此方法接收Matrix对象作为参数。单一的3×3矩阵可存储一种变换或一个变换序列。图显示了一个路径在执行两种变换前后的情况。

图路径的变换 5)、可伸缩区域

GDI+通过对可伸缩区域(ScalableRegions)的支持极大地扩展了GDI。在GDI中,区域被存储在设备坐标中,而且,可应用于区域的惟一变换是平移。而GDI+在全局坐标中存储区域,并且允许区域发生任何可存储在变换矩阵中的变换(如缩放和旋转)。图显示一个区域在执行三种变换(缩放、旋转和平移)前后的情况。

图区域的三种变换(缩放、旋转和平移) 6)、α混色

在下图中,可以在变换区域(用蓝色阴影画笔填充)中看到未变换区域(用红色填充)。这是由GDI+支持的α混色(AlphaBlending,透明混合)实现的。使用α混色,可以指定填充颜色的透明度。透明色与背景色相混合———填充色越透明,透出的背景色就越多。图显示四个用相同颜色(红色)填充、但透明层次不同的椭圆。

图不同透明度 7)、丰富的图像格式支持

GDI+提供Image、Bitmap和Metafile类,可以用不同的格式加载、保存和操作图像。GDI+支持BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF共9种常见的图像格式。 8)、GDI+的不足

虽然,相对于GDI来说,GDI+确实增加了许多新特性,而且功能更强大,使用也更方便。但是,这并不等于GDI+就能够完全代替GDI。

因为GDI+实际上是GDI的封装和扩展,GDI+的执行效率一般要低于GDI的。另外,GDI+不支持图的位运算,那么就不能进行异或绘图等操作。而且在VC中,GDI+还不支持双缓存机制(如内存DC和显示DC),这将大大影响GDI+在高速图形、图像、动画和视频等方面的应用。

http://www.mybdqn.com/

3、GDI+的使用 1)GDI+开发包

若采用的是VisualC++2008,则已经包含了开发GDI+应用程序所需的所有东西。如果使用的是VisualC++6.0而非VS.Net,我们需要下载微软的GDIPLUS支持包。在微软官方网站下载时需认证Windows为正版,我们可从这个地址下载:http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip。一个完整的GDI+支持包至少包括如下文件: (1)头文件:gdiplus.h

(2)动态链接库的.lib文件:gdiplus.lib (3)动态链接库的.dll文件:gdiplus.dll

少了(1)、(2)程序不能编译,少了(3)程序能以共享DLL的方式编译但是不能运行,运行时找不到.dll文件。 如果你使用的操作系统是WindowsXP或WindowsServer2003,则GDI+所对应的动态链接库,已经被包含在其中。gdiplus.dll一般位于操作系统的WinSxS(Windowsside-by-sideassembly,视窗并行程序集)目录中,例如:

C:/WINDOWS/WinSxS/x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.0.0_x-ww_8d353f13/gdiplus.dll(1661KB,2002.10.8)

而GDI的动态链接库gdi32.dll,却一般在操作系统的32位系统目录中: F:/WINDOWS/system32/gdi32.dll(272KB,2004.8.4) 2)VC使用GDI+初始化准备工作。 #defineUNICODE #ifndefULONG_PTR

#defineULONG_PTRunsignedlong* #endif

#include%usingnamespaceGdiplus;

#pragmacomment(lib,\//在CWinApp派生类的InitInstance函数中加入: //初始化gdiplus的环境

GdiplusStartupInputgdiplusStartupInput; ULONG_PTRgdiplusToken; //初始化GDI+.

GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL); //在CWinApp派生类的ExitInstance函数中加入: //关闭gdiplus的环境

GdiplusShutdown(gdiplusToken);

4、GDI+的组成

GDI+API包含54个类、12个函数、6类(226个)图像常量、55种枚举和19种结构。 1)、类

GDI+API中共有54个类,核心类是Graphics,它是实际绘制直线、曲线、图形、图像和文本的类。许多其它GDI+类是与Graphics类一起使用的。例如,DrawLine方法接收Pen对象,该对象中存有所要绘制的线条的属性(颜色、宽度、虚线线型等)。FillRectangle方法可以接收指向LinearGradientBrush对象的指针,该对象与Graphics对象配合工作来用一种渐变色填充矩形。Font和StringFormat对象影响Graphics对象绘制文本的方式。Matrix对象存储并操作Graphics对象的仿射变换——旋转、缩放和翻转图像。

GDI+还提供了用于组织图形数据的几种结构类(例如Rect、Point和Size)。而且,某些类的主要作用是结构化数据类型。例如,BitmapData类是Bitmap类的帮助器,PathData类是GraphicsPath类的帮助器。 下面是所有GDI+的API类的列表: