GDI+概述

    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对象指针的构造函数。

你可能感兴趣的:(GDI+概述)