VC GDI+进阶1:初识GDI+
一、GDI
GDI全称是Graphic Device Interface,即图形设备接口,是操作系统提供的位于应用程序层和不同硬件层的中间层。软件开发人员可以直接调用GDI提供的接口函数来对不同输出设备进行绘制。
二、GDI+
GDI+是Windows对GDI的升级版本,对GDI进行了一些优化,并在此基础上增加了许多新的特性,如渐变色填充、反走样绘图等。GDI+已经出现差不多10个年头了,但目前在vc领域的开发工作中,还是有相当大一部分比例仍然在使用笨拙的GDI。
在VC下使用的GDI+接口其实是微软提供的一套基于C++的类库,其中的类信息如下:
三、GDI+与GDI主要变化
1、不再使用设备环境或句柄
在使用GDI进行绘图时,必须要指定一个设备环境(DC, Device Context),用来将某个窗口或设备与设备环境类的句柄指针关联起来,所有的绘图操作都与该句柄有关。而GDI+不再使用这个设备环境或句柄,取而代之是使用Graphics对象。与设备环境相类似,Graphics对象也是将屏幕的某一个窗口与之相关联,并包含绘图操作所需要的相关属性。但是,只有这个Graphics对象与设备环境句柄还存在着联系,其余的如Pen、Brush、Image和Font等对象均不再使用设备环境。
2、GDI+中无“当前状态”(GDI中的有状态绘图与GDI+的无状态绘图)
在GDI中,如要绘制一条直线,通常是类似这样的做法:
dc.Moveto(Point1);
dc.Lineto(Point2);
即dc保存了一个“当前位置”的状态信息,另外,dc在绘图的时候,会使用“当前画笔”(dc中通过SelectObject来改变当前画笔或画刷);
而在GDI+中,不存在这种当前位置或当前画笔的状态;在GDI+中绘制直线,直接像如下调用:
Status DrawLine(const Pen *pen,
const Point &pt1,
const Point &pt2
);
即直接指定要使用的画笔Pen和直线的起始点来绘制。GDI+的这种无状态绘图方式,可以使得程序的可读性更好。
3、GDI+中绘制边框和填充的分离
在GDI中绘制一个形状时,比如一个rect,总是形状轮廓和其内部使用同一个绘制函数:GDI使用当前画笔来绘制轮廓,使用当前画刷开填充形状;而在GDI+中,已经将形状的轮廓绘制和内容填充分离开来,使得图形的绘制更加灵活。
四、GDI+中的一些新特性
GDI+中新增了一些诸如渐变画笔、基数样条、矩阵与形状变换、alpha混合(透明处理)、多种图像格式支持等特性。这些特性使得GDI+在绘图方面比GDI更加出色,使用GDI+的这些新特性可以轻松制作出漂亮的界面。