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 操作系统中重新分发部署。下载最新的可重新分发安装包,参见:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm
.
注意:如果您将 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 -