Windows GDI+是 Windows XP 或者 Windows Server 2003操作系统的 负责显示屏幕信息和打印操作的子系统。 GDI+是一组采用C++类封装的 API。
GDI+可分为三部分:
<1> 2-D vector graphics (2D矢量图形), 这部分主要涉及画一些基本图形,如线,曲线,图表等。 基本图形是通过在屏幕坐标中通过一系列点组成的。
<2> Imaging(图片),有些图片使用矢量绘图会很困难, 因此GDI+的一些类用于绘制这些图片,这些类将图片作为位图来存储
<3>字体, 字体主要关注于这么显示各种不同的尺寸,风格的字体。
GDI+基于类的接口的结构
Windows GDI+基于 C++类的接口,包括大约40个类,50个枚举,6个结构。 也有一些函数不属于任何类。
在使用任何GDI+函数时,必须指定命名空间: Gdiplus ;
using namespace Gdiplus;
不属于任何类的函数,其中两个是:
Status GdiplusStartup( __out ULONG_PTR token *token, __in const GdiplugsStartupInput *input, __out GdiplusStartupOutput *output); void GdiplusShutdown(__in ULONG_PTR token);
GdiplusStartup()函数必须在任何GDI+函数被调用之前调用, 而在用完GDI+后,必须调用 GdiplusShutdown()函数。
GDI+的新功能:
GDI+与 GDI的不同点表现在两个方面。
一,GDI+通过提供新功能来扩展GDI, 如 gradient brushes(渐变画刷) 和 alpha blending(alpha混合,透明度)等新特性。
二,GDI+使得图形编程模型变得更容易和灵活。
新功能列举:
1. Gradient Brushes(渐变画刷), GDI+提供线性渐变和路径渐变画刷来填充封闭形状,路径 和 区域。
2. Cardinal Splines, 是由一些列单独的曲线 组合成一个大曲线。
3. Independent Path Objects , 在GDI中,一个路径属于一个设备环境,当路径被画了之后,路径也被销毁了。而在GDI+中,你可以创建和维护多个 GraphicsPath对象,这些对象是与Graphics对象分离的。而一个GraphicsPath被绘制时,它不会被销毁,所以你可多次使用同一个 GraphicsPath对象。
4. Transformations and the matrix object, 转换 和 矩阵对象。 GDI+提供了Matrix对象,这对于转换(旋转,变换等)是一个强大的工具。
5. Scalable Regions , GDI+对 GDI支持的 region 做了极大的扩展。 在GDI中, region被存储在设备坐标中,并且唯一能用的transformation 就是 translation 。 GDI+将 region存储在 世界坐标系中,并且允许 region做任何能够存储在 Matrix中的任何 transformation。 如缩放,旋转 和 translate 等。
5. Alpha Blending , alpha blending允许你指定要填充颜色的透明度。 一个透明的颜色会与背景色混合,透明度愈高,那背景色将越突出。
6. Support for multiple Image Formats, 支持多种图片格式。 GDI+提供了 Image , Bitmap , Metafile 类,使得你能够加载,保存和操作多种格式的图片,以下图片格式被支持:
BMP, GIF , JPEG , Exif , PNG , TIFF , ICON , WMF , EMF .
GDI+ 与 GDI 编程模型的不同
Device Contexts , Handles , Graphics Objects
GDI+与GDI编程模型的不同的一个方面在于 Device Context 句柄. 当使用GDI+编程时不需要关注Device Context。这里所说的GDI+编程不需要关注Device Context , 只是相对于 GDI来说的。 其实际的意思是,GDI+的所有绘图函数都不需要再传递Device Context 句柄了,在其他方面与GDI是相同的, 例如,绘图前必须获得Device Context,GDI是将获得的Device Context句柄传递给要调用的所有与GDI相关的函数, 而 GDI+只是利用获得的Device Context来初始化Graphicx对象,其他与GDI+相关的函数就不再需要传递Device Context句柄了。(因为GDI 的所有绘图函数都需要将 Device Context 句柄 作为参数传递给绘图函数)
Graphics对象: Graphics对象类似于 Device Context,它包含对象如何在屏幕中绘制的各种属性。(Graphics是以面向对象的方法,对Device Context进行的封装)。 另外,绘图的方法基本都是由Graphics对象提供的。
Graphics对象与 pen , brush ,path , image等是分离的。 这句话的意思是,在GDI中,pen, brush, path 等都是被 selectObject 进 Device Context中的。 而在 GDI+中,pen , brush , path ,image 等是传递给绘图函数的。
重载的方法
很多GDI+方法都被重载了的。例如, DrawLine方法:
Status DrawLine(const Pen* pen, REAL x1, REAL y1, REAL x2, REAL y2); Status DrawLine(const Pen* pen, const PointF& pt1, const PointF& pt2); Status DrawLine(const Pen* pen, INT x1, INT y1, INT x2, INT y2); Status DrawLine(const Pen* pen, const Point& pt1, Point& pt2);
绘图和填充的方法是分来的
当在GDI中,绘制一个矩形,并填充矩形内区域时,其绘制矩形轮廓和填充矩形内区域是一个步骤完成的。其轮廓是当前selectObject进Device Context的 画笔,区域填充是 当前选入 Device Context的 画刷。如:
hBrush = CreateHatchBrush(HS_CROSS, RGB(0,0,255)); hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0)); SelectObject(hdc,hBrush); SelectObject(hdc,hPen); Rectangle(hdc, 100, 50, 200, 80);
在GDI+中,绘制轮廓 和 填充 是分开进行的:
HatchBrush *myHatchBrush = new HatchBrush(HatchStyleCross, Color(255,0,255,0),Color(255,0,0,255)); Pen *myPen = new Pen(Color(255,255,0,0), 3); myGraphics.FillRectangle(myHatchBrush, 100, 50, 100, 30); myGraphics.DrawRectangle(myPen, 100, 50, 100, 30);
构建区域
在GDI中,提供了很多函数来创建区域,如 CreateRectRgn , CreateRoundRectRgn, CreateEllpticRgn , CreatePolygonRgn , CreatePolyPolygonRgn 。
在GDI+中, 提供了 Region类, 它提供了两个构造函数, 一个是接受一个 Rect对象引用的构造函数, 另个是接受一个GraphicsPath对象指针的构造函数。