GDI+ SDK 参考(翻译版本)
序言 ............................................................................................................................................. - 4 -
目标...................................................................................................................................... - 4 -
适用范围.............................................................................................................................. - 4 -
适用读者.............................................................................................................................. - 4 -
运行环境.............................................................................................................................. - 4 -
文档组织.............................................................................................................................. - 4 -
相关主题.............................................................................................................................. - 4 -
GDI+的安全考虑 ........................................................................................................................ - 6 -
检验构造函数调用成功与否.............................................................................................. - 6 -
分配缓冲区.......................................................................................................................... - 6 -
错误校验.............................................................................................................................. - 7 -
线程同步.............................................................................................................................. - 9 -
相关主题............................................................................................................................ - 10 -
关于 GDI+ ................................................................................................................................. - 11 -
GDI+ 介绍 ........................................................................................................................ - 11 -
GDI+ 概览 .............................................................................................................. - 11 -
GDI+ 的三个组成部分........................................................................................... - 11 -
基于类的接口架构.................................................................................................... - 12 -
GDI+提供了哪些新东西? .............................................................................................. - 12 -
新特征........................................................................................................................ - 12 -
编程模式的改变........................................................................................................ - 15 -
线条、曲线和图形............................................................................................................ - 19 -
矢量图概览................................................................................................................ - 19 -
钢笔、线条和矩形.................................................................................................... - 20 -
椭圆和弧.................................................................................................................... - 22 -
多边形........................................................................................................................ - 22 -
基数样条.................................................................................................................... - 23 -
贝塞尔样条................................................................................................................ - 24 -
路径............................................................................................................................ - 25 -
画刷和填充图形........................................................................................................ - 27 -
开放与闭合曲线........................................................................................................ - 29 -
区域............................................................................................................................ - 30 -
裁剪............................................................................................................................ - 31 -
路径平直化................................................................................................................ - 32 -
线条和曲线的抗锯齿功能........................................................................................ - 32 -
图象、位图和图元文件.................................................................................................... - 33 -
位图类型.................................................................................................................... - 34 -
图元文件.................................................................................................................... - 37 -
绘制、定位和复制图片............................................................................................ - 39 -
裁剪和缩放图象........................................................................................................ - 40 -
坐标系统和转换................................................................................................................ - 42 -
坐标系统类型............................................................................................................ - 42 -
- 1 -
以矩阵来表示转换.................................................................................................... - 44 -
全局和局部转换........................................................................................................ - 48 -
图形容器............................................................................................................................ - 51 -
使用 GDI+ ................................................................................................................................. - 56 -
使用入门............................................................................................................................ - 56 -
绘制线条.................................................................................................................... - 56 -
绘制字符串................................................................................................................ - 58 -
使用钢笔绘制线条和形状................................................................................................ - 59 -
使用钢笔绘制线条和矩形........................................................................................ - 59 -
设置钢笔的宽度和对齐方式.................................................................................... - 60 -
绘制具有线帽的线条................................................................................................ - 61 -
联接线条.................................................................................................................... - 62 -
绘制自定义虚线........................................................................................................ - 62 -
绘制用纹理填充的线条............................................................................................ - 63 -
使用画笔填充形状............................................................................................................ - 63 -
用纯色填充形状........................................................................................................ - 64 -
用阴影图案填充形状................................................................................................ - 64 -
用图像纹理填充形状................................................................................................ - 64 -
在形状中平铺图像.................................................................................................... - 65 -
用渐变色填充形状.................................................................................................... - 68 -
使用图像、位图和图元文件............................................................................................ - 68 -
加载和显示位图........................................................................................................ - 68 -
加载和显示图元文件................................................................................................ - 69 -
记录图元文件............................................................................................................ - 69 -
剪裁和缩放图像........................................................................................................ - 71 -
旋转、反射和扭曲图像............................................................................................ - 72 -
缩放时使用插值模式控制图像质量........................................................................ - 73 -
创建缩略图像............................................................................................................ - 75 -
采用高速缓存位图来提高性能................................................................................ - 76 -
通过避免自动缩放改善性能.................................................................................... - 76 -
读取图像元数据........................................................................................................ - 77 -
使用图像编码器和解码器................................................................................................ - 83 -
列出已安装的编码器................................................................................................ - 83 -
列出已安装的解码器................................................................................................ - 84 -
获取解码器的类标识符............................................................................................ - 86 -
获取编码器的参数列表............................................................................................ - 88 -
将 BMP 图像转换为 PNG 图像............................................................................. - 100 -
设定 JPEG 的压缩等级.......................................................................................... - 101 -
对 JPEG 图像进行无损变换.................................................................................. - 102 -
创建和保存多帧图像.............................................................................................. - 105 -
从多帧图像中复制单帧.......................................................................................... - 107 -
Alpha 混合线条和填充.................................................................................................. - 109 -
绘制不透明和半透明的线条.................................................................................. - 109 -
用不透明和半透明的画笔绘制.............................................................................. - 110 -
- 2 -
使用复合模式控制 Alpha 混合........................................................................... - 111 -
使用颜色矩阵设置图像中的 Alpha 值............................................................... - 112 -
设置单个象素的 alpha 值..................................................................................... - 114 -
使用字体和文本.............................................................................................................. - 115 -
构造字体系列和字体.............................................................................................. - 115 -
绘制文本.................................................................................................................. - 116 -
格式化文本.............................................................................................................. - 117 -
枚举已安装的字体.................................................................................................. - 120 -
创建专用的字体集合.............................................................................................. - 122 -
获取字体规格.......................................................................................................... - 126 -
对文本使用消除锯齿效果...................................................................................... - 130 -
构造并绘制曲线.............................................................................................................. - 131 -
绘制基数样条曲线.................................................................................................. - 131 -
绘制贝塞尔样条...................................................................................................... - 133 -
用渐变画刷填充形状...................................................................................................... - 134 -
创建线性渐变.......................................................................................................... - 134 -
创建路径渐变.......................................................................................................... - 137 -
将 Gamma 校正应用于渐变 .............................................................................. - 144 -
构造并绘制路径.............................................................................................................. - 145 -
使用线条、曲线和形状创建图形.......................................................................... - 145 -
填充开放式图形...................................................................................................... - 147 -
使用图形容器.................................................................................................................. - 147 -
管理 Graphics 对象的状态 ................................................................................ - 148 -
使用嵌套的 Graphics 容器 ................................................................................ - 151 -
变换.................................................................................................................................. - 154 -
使用世界变换.......................................................................................................... - 154 -
为什么变换顺序非常重要...................................................................................... - 155 -
使用区域.......................................................................................................................... - 156 -
对区域使用点击检测.............................................................................................. - 156 -
对区域使用剪辑...................................................................................................... - 157 -
对图像重新着色.............................................................................................................. - 158 -
使用颜色矩阵对单色进行变换.............................................................................. - 158 -
转换图像颜色.......................................................................................................... - 160 -
缩放颜色.................................................................................................................. - 161 -
旋转颜色.................................................................................................................. - 164 -
剪取颜色.................................................................................................................. - 166 -
使用颜色重映射表.................................................................................................. - 168 -
打印.................................................................................................................................. - 169 -
将 GDI+输出至打印机.......................................................................................... - 169 -
显示一个打印对话框.............................................................................................. - 172 -
通过提供打印机句柄优化打印.............................................................................. - 173 -
附录:GDI+ 参考 .................................................................................................................. - 176 -
- 3 -
序言
目标
Microsoft Windows GDI+是为 C/C++开发者提供的一个基于类的应用程序编程接口(API)。它
使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于 Microsoft Win32 的应用程序不
能直接访问图形硬件,而是通过 GDI+来协调设备驱动和程序动作的交互。GDI+同样支持 Microsoft
Win64。
适用范围
GDI 适用于所有的 Window 应用程序。GDI+是包含于 Windows XP 和 Windows Server 2003
中的一项新技术。运行于 Microsoft Windows NT 4.0 SP6、Windows 2000、Windows 98 和
Windows Me 操作系统的应用程序在分发的时候需要包含 GDI+。
适用读者
GDI+ C++ 基类接口是为 C/C++开发者所设计。需要精通 Windows 图形用户接口和消息驱动机
制。
运行环境
Gdiplus.dll包含在Windows XP中。某些特定的类和方法可能需要特定操作系统的支持,请参阅文
档中相应的类和方法。GDI+可以在Windows NT 4.0 SP6、 Windows 2000、 Windows 98 以及
Windows Me操作系统中重新分发部署。下载最新的可重新分发安装包,参见:
Hhttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htmH
.
注意:如果您将 GDI+分发到低版本系统平台或者该平台本身不包含该版本的 GDI+,则将 Gdiplus.dll
安装到您的应用程序目录下。这样将它放到了您自己的地址空间下,但是您应该使用/BASE 连接器选项重
构基地址,避免地址空间冲突。
文档组织
GDI+参考文档采用下面表格所示进行组织:
概览 关于 GDI+的概要信息。
用法 使用 GDI+的任务和例子。
参考
GDI+ C++基类 API 参考文档。
相关主题
Windows GDI
DirectX
- 4 -
Windows Image Acquisition
OpenGL
Windows Multimedia
- 5 -
GDI+的安全考虑
本主题提供关于采用 Microsoft Windows GDI+进行开发的安全考虑。本主题没有提供所有您想了
解的安全性相关主题――取而代之,我们将它作为本技术领域的出发点和基准。
检验构造函数调用成功与否
很多 GDI+类提供一个 Image::GetLastStatus 方法,您可以调用它检测某个对象的方法调用是否
成功。您也可以调用 GetLastStatus 来判断构造函数是否成功调用。
下面的例子展示了如何构造一个 Image 对象并且调用 GetLastStatus 方法来判断构造成功与否。
返回值 OK 和 InvalidParameter 是 Status 枚举的成员。
Image myImage(L"Climber.jpg");
Status st = myImage.GetLastStatus();
if(Ok == st)
// The constructor was successful. Use myImage.
else if(InvalidParameter == st)
// The constructor failed because of an invalid parameter.
else
// Compare st to other elements of the Status
// enumeration or do general error processing.
分配缓冲区
有几个 GDI+方法采用调用者分配的缓冲区来返回数字或者字符数据。其中每个方法都有一个关联方
法来提供所需缓冲区的大小。例如,GraphicsPath::GetPathPoints 方法返回一个 Point 对象数组。在
您调用 GetPathPoints 之前,您必须分配足够大的缓冲区来容纳这个数组。而您可以调用 GraphicsPath
对象的 GetPointCount 方法来计算所需缓冲区的大小。
下面的例子展示了如何判断一个 GraphicsPath 对象的点数,并分配足够大的缓冲区来容纳这些点,
然后调用 GetPathPoints 方法来填充该缓冲区。在调用 GetPathPoints 的代码之前,需要检测缓冲
区分配是否成功,方法是看缓冲区指针是否不等于 NULL。
GraphicsPath path;
path.AddEllipse(10, 10, 200, 100);
INT count = path.GetPointCount(); // get the size
Point* pointArray = new Point[count]; // allocate the buffer
if(pointArray) // Check for successful allocation.
{
- 6 -
path.GetPathPoints(pointArray, count); // get the data
... // use pointArray
delete[] pointArray; // release the buffer
pointArray = NULL;
}
前面的例子采用 New 操作符分配缓冲区。采用 New 操作符非常方便,因为缓冲区是由明确类型的
Point 对象所构成。有些时候,GDI+写入比 GDI+对象数组更多的信息到缓冲区。有时缓冲区在填入
GDI+对象数组的同时还通过这些对象的成员来指向额外的数据信息。例如,Image::
GetAllPropertyItems 方法返回一个 PropertyItem 对象数组,每个属性项目(一段元数据)都存储在图
象中。但是 GetAllPropertyItems 返回的信息不止这些对象数组;它还为这些数组追加了额外的数据。
在您调用 GetAllPropertyItems 之前,您必须为对象数组以及这些附加数据分配足够大的空间。
您可以调用 Image 对象的 GetPropertySize 方法来判断所需缓冲区的总大小。
下面的例子展示了如何创建一个 Image 对象,然后调用该对象的 GetAllPropertyItems 方法来
获取所有存储于图象中的属性项目(元数据)。该代码采用 GetPropertySize 方法返回的大小值来分配
缓冲区。GetPropertySize 同时返回一个数值,表示该 Image 中的属性项目的数量。需要注意的是,
这里没有采用 count*sizeof(PropertyItem)来计算缓冲器大小。显然,采用这种方法计算出来的值太小
了。
UINT count = 0;
UINT size = 0;
Image myImage(L"FakePhoto.jpg");
myImage.GetPropertySize(&size, &count);
// GetAllPropertyItems returns an array of PropertyItem objects
// along with additional data. Allocate a buffer large enough to
// receive the array and the additional data.
PropertyItem* propBuffer =(PropertyItem*)malloc(size);
if(propBuffer)
{
myImage.GetAllPropertyItems(size, count, propBuffer);
...
free(propBuffer);
propBuffer = NULL;
}
错误校验
GDI+参考中的大部分例子代码都没有进行错误校验。因为完整的错误校验将会使得示例代码变得更
大,使得例子本身想要阐述的要点变得模糊。您不应该直接把文档中的例子代码粘贴到您的产品代码中使
用;您应该适当的加入您自己的错误校验代码来增强该代码。
- 7 -
下面的代码展示了实现 GDI+错误校验的方法。每次一旦某个 GDI+对象被构造,代码都将检查该构
造函数是否成功。该检查对于 Image 的构造函数而言尤其重要,因为它依赖于对一个文件的读取。如果
所有四个 GDI+对象(Graphics, GraphicsPath, Image, and TextureBrush)均成功构造,代码才
可以调用这些对象的方法。每个方法调用也要检测是否成功,一旦发生错误,剩下的方法调用将被略过。
Status GdipExample(HDC hdc)
{
Status status = GenericError;
INT count = 0;
Point* points = NULL;
Graphics graphics(hdc);
status = graphics.GetLastStatus();
if(Ok != status)
return status;
GraphicsPath path;
status = path.GetLastStatus();
if(Ok != status)
return status;
Image image(L"MyTexture.bmp");
status = image.GetLastStatus();
if(Ok != status)
return status;
TextureBrush brush(&image);
status = brush.GetLastStatus();
if(Ok != status)
return status;
status = path.AddEllipse(10, 10, 200, 100);
if(Ok == status)
{
status = path.AddBezier(40, 130, 200, 130, 200, 200, 60, 200);
}
if(Ok == status)
{
count = path.GetPointCount();
status = path.GetLastStatus();
}
if(Ok == status)
- 8 -