2001年6月,微软新发布GDI+(念GDI plus)。此技术首先被应用于Windows XP,但在所有
的Windows系统中都可以使用,需要gdiplus.dll支持。很久没有写基于GDI的图形程序了
,最近由于要编写一个小程序,才开始关注这个东西,发现还是很好用的,因此参考了
msdn的一些章节,整理了一下,给尚未关注这个非常有用的软件包的网友们一个浅浅的
印象。并呼吁大家彻底放弃GDI,转向新的、功能强大的GDI+
概述
GDI+ 是 Microsoft? Windows? XP 操作系统的子系统,负责在屏幕和打印机上显示信息
。顾名思义,GDI+ 是 GDI(Windows 早期版本提供的图形设备接口)的后续版本。GDI
+ 是一种应用程序编程接口 (API),通过一套部署为托管代码的类来展现。这套类被称
为 GDI+ 的“托管类接口”。
应用程序的程序员可利用 GDI+ 这样的图形设备接口在屏幕或打印机上显示信息,而不
需要考虑特定显示设备的具体情况。应用程序的程序员调用 GDI+ 类提供的方法,而这
些方法又反过来相应地调用特定的设备驱动程序。GDI+ 将应用程序与图形硬件隔离,而
正是这种隔离允许开发人员创建设备无关的应用程序。
GDI+ 的三个组成部分
GDI+ 的
二维矢量图形
图像处理
版式
二维矢量图形
矢量图形包括坐标系统中的系列点指定的绘图基元(例如,直线、曲线和图形)。例如
,直线可通过它的两个端点来指定,而矩形可通过确定其左上角位置的点并给出其宽度
和高度的一对数字来指定。简单路径可由通过直线连接的点的数组来指定。贝塞尔样条
是由四个控制点指定的复杂曲线。
GDI+ 提供了存储基元自身相关信息的类(和结构)、存储基元绘制方式相关信息的类,
以及实际进行绘制的类。例如,Rectangle 结构存储矩形的位置和尺寸;Pen 类存储有
关线条颜色、线条粗细和线型的信息;而 Graphics 类具有用于绘制直线、矩形、路径
和其他图形的方法。还有几种 Brush 类,它们存储有关如何使用颜色或图案来填充封闭
图形和路径的信息。
您可以在图元文件中记录矢量图像(图形命令的序列)。GDI+ 提供了 Metafile 类,可
用于记录、显示和保存图元文件。MetafileHeader 和 MetaHeader 类允许您检查图元文
件头中存储的数据。
图像处理
某些种类的图片很难或者根本无法用矢量图形技术来显示。例如,工具栏按钮上的图片
和显示为图标的图片就难以指定为直线和曲线的集合。拥挤的棒球运动场的高分辨率数
字照片会更难以使用矢量技术来制作。这种类型的图像可存储为位图,即代表屏幕上单
个点颜色的数字数组。GDI+ 提供了 Bitmap 类,可用于显示、操作和保存位图。
版式
版式关系到使用各种字体、字号和样式来显示文本。GDI+ 为这种复杂任务提供了大量的
支持。GDI+ 中的新功能之一是子像素消除锯齿,它可以使文本在 LCD 屏幕上呈现时显
得比较平滑。
基于类的接口结构
GDI+ 的托管类接口包含大约 60 个类、50 个枚举和 8 个结构。Graphics 类是 GDI+
的核心功能,它是实际绘制直线、曲线、图形、图像和文本的类。
许多类与 Graphics 类一起使用。例如,Graphics.DrawLine 方法接收 Pen 对象,该对
象中存有所要绘制的线条的属性(颜色、宽度、虚线线型和外观)。Graphics.FillRec
tangle 方法可以接收指向 LinearGradientBrush 对象(它使用 Graphics 对象以渐变
色填充矩形)的指针。Font 和 StringFormat 对象影响 Graphics 对象绘制文本的方式
。Matrix 对象存储并操作 Graphics 对象的全局变形,该对象用于旋转、缩放和翻转图
像。
GDI+ 为组织图形数据提供了几种结构(例如,Rectangle、Point 和 Size)。而且,某
些类的主要作用是结构化数据类型。例如,BitmapData 类是 Bitmap 类的助手,而 Pa
thData 类是 GraphicsPath 类的助手。
GDI+ 定义了几种枚举,它们是相关常量的集合。例如,LineJoin 枚举包含元素 Bevel
、Miter 和 Round,它们指定可用于连接两个线条的样式。
UNICODE
一些平时不喜欢使用UniCode的老兄们注意了,你会发现,GDI+只喜欢你使用UniCode,看
看下面的几个函数声明然后再想想你是不是应该转换你的编程模式了……
StatusGraphics::DrawString(
const WCHAR* string,
INT length,
const Font* font,
const RectF& layoutRect,
const StringFormat* stringFormat,
const Brush* brush
);
staticImage* Image::FromFile(
const WCHAR* filename,
BOOL useEmbeddedColorManagement
);
名字空间
GDI+,将在名字空间Gdiplus下面进行工作,因此,你的应用程序必须声明
usingnamespace Gdiplus;
否则会使编程变得麻烦……