GDI+是Windows 2000及以后版本的一个子系统,同原有的GDI(图形设备接口)一样,主要负责对显示器和打印机进行管理。GDI+为我们提供了在编程时使用的应用程序接口API(Application Programming Interface),通过这些API函数,GDI+让程序员在设计程序中不必考虑具体的显示器或打印机,直接使用由GDI+提供的类的方法便可以调用显示器或打印机,真正做到与设备无关。
注:如果使用GDI+图形系统,图形和艺术字将具有更平滑的轮廓,以及可调整的用真实颜色调和的透明度级别。在调整图片大小时,图片的显示将会更加清晰。
功能及特色
正如其名称一样,GDI+是对原有的GDI在功能上的升级,GDI+为我们提供的功能主要有三类:矢量图形输出、光栅图形输出和文字排版等。
GDI+与传统的GDI相比,主要有以下六方面的新特色:渐变画刷、独立的路径对象(Path Objects)、矩阵对象(Matrix Object)、区域(Scalable Regions)、Alpha Blending和多格式图片支持。
设备环境和图形对象
熟悉GDI编程的朋友对设备环境DC(Device Context)应该不会陌生。DC的数据结构存储了显示器(或打印机)的性能、属性之类的详细信息,这些数据信息决定程序如何在显示器上进行输出。所有的输出都通过DC来实现,如果想在窗口中画一个矩形,首先得通过GetDC得到DC,然后让DC去执行具体操作。
使用GDI+后,就不必考虑句柄、设备环境等概念了。只要简单地创建一个图形对象(Graphics Object),然后直接调用该对象的方法(Methods)进行绘图即可。图形对象是GDI+的核心,它和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于对象模型的GDI+。
同DC一样,图形对象也是和具体的窗口或是屏幕结合在一起的。图形对象中也包括了许多具体属性,这些具体的属性值指明了进行绘图的方法。图形对象中没有在DC中所绑定的具体的画笔、画刷、路径等对象。在GDI中绘图,首先必须为DC中选入一个画笔对象(在DC中的画笔只有一支是可以使用的),这支“笔”一直会使用到下次新选定画笔为止。而在GDI+中,你只需要在图形对象中调用画直线时,将画笔作为画直线的一个参数就可以了,即在GDI+中,可以同时使用多个画笔进行不同的绘图操作。
参数化的对象
从OnDrawlineGdiplus()的代码可以看出,GDI+可以将画笔作为单独的对象进行管理。并且对画刷、路径、图片、字体等对象也实现了参数化。在GDI+的图形对象中,这些对象被作为参数来传递的。举例说明,在填充矩形区域时,使用红色画刷,要做的只是建立红色画刷,在调用FillRectangle函数时,将红色画刷作为函数的参数,这样就能完成填充过程。
摒弃当前位置的概念
从上面的示例代码OnDraLine可以看出,在GDI中画一条直线首先得将笔的“当前位置”移到直线的起点坐标上(MoveTo),然后才能进行画直线的操作。“当前位置”这个定义给编程带来了不少的麻烦。GDI+中解决了这个问题,摒弃了“当前位置”这个没有多大用处的概念。对于画直线,直接说明起止点的坐标就行了。
注:如果你习惯了原来的GDI编程,这点应该引起你的注意。
方法的重载
GDI+的图形对象中有许多的方法在调用时可有多种形式,如画直线的函数DrawLine就有以下的几种调用方法:
Status DrawLine(IN const Pen* pen, IN REAL x1, IN REAL y1, IN REAL x2, IN REAL y2);
Status DrawLine(IN const Pen* pen, IN const PointF&& pt1, IN const PointF&& pt2);
Status DrawLine(IN const Pen* pen, IN INT x1, IN INT y1, IN INT x2, IN INT y2);
Status DrawLine(IN const Pen* pen, IN const Point&& pt1, IN const Point&& pt2);
上面的四种调用方式的目的都一样,从起点到终点以pen画笔画一条直线。
注:方法的重载为多样化的编程提供了方便。
绘图和填充相互独立
在GDI中使用Rectangle绘制矩形时,GDI用当前画笔绘制轮廓、用当前的画刷将矩形内部自动填充,画矩形和填充一步完成。而GDI+则将绘制轮廓填充内部相分离,这样一来,GDI+绘制填充轮廓时就显得更灵活。
构造区域
区域是窗口内的一块多边形或椭圆形的区域。在GDI中,CreateRectRgn、Crea-
teEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等函数都是与构造各种区域有关的,在GDI+中,这一切变得相对简单。在GDI+中,我们可以将一个矩形对象(Rectangle Object)作为参数传递给区域类(Region Class)的构造函数,这个参数也可以是图形路径对象(GraphicsPath Object)的地址,这样一来,创建一个区域较GDI要简单的多。比如,你想要创造一个椭圆形的区域,首先建立一个包含椭圆的图形路径对象A,通过“Region Region1(&&A)”便可以做出椭圆形的区域对象Region1。对于复杂区域(由各种形状和路径合成的区域),GDI+采用了新的管理方式。区域类支持区域、路径合成、交集运算。
支持GDI+的SDK
最新的Platform SDK支持我们直接使用GDI+。Platform为GDI+提供的头文件及库文件中,有40个类、50个列举(Enumerations)及6个结构(Structures)。其中,最关键的是图形类(Graphics Class),通过该类能够进行画直线、曲线、图片及文字输出。在这些类中,每个类之间并不是完全独立的,它们通常互为参数。开始调用GDI+函数之前,使用GdiplusStartup对GDI+进行启动。函数调用完之后,应使用GdiplusShutdown函数进行终止操作。