logo资料库

GDI+教程(C++中文版).pdf

第1页 / 共176页
第2页 / 共176页
第3页 / 共176页
第4页 / 共176页
第5页 / 共176页
第6页 / 共176页
第7页 / 共176页
第8页 / 共176页
资料共176页,剩余部分请下载后查看
目录
序言
GDI+的安全考虑
GetLastStatus
分配缓冲区
错误校验
线程同步
关于GDI+
GDI+介绍
GDI+提供的新东西
线条、曲线和图形
图像、位图与图元文件
位图类型
图元文件(矢量图片)
绘制、定位和复制图片
裁剪和缩放图像
坐标系统和转换
坐标系统类型
以矩阵来表示转换
全局和局部转换
图形容器
使用GDI+
使用入门
绘制线条
绘制字符串
使用钢笔绘制线条和形状
使用钢笔绘制线条和矩形
设置钢笔的宽度和对齐方式
绘制具有线帽的线条
联接线条
绘制自定义虚线
绘制用纹理填充的线条
使用画笔填充形状
用纯色填充形状
用阴影图案填充形状
用图像纹理填充形状
在形状中平铺图像
用渐变色填充形状
使用图像、位图和图元文件
加载和显示位图
加载和显示图元文件
记录图元文件
裁剪和缩放图像
旋转、反射和扭曲图像
缩放时使用插值模式控制图像质量
创建缩小图像
采用高速缓存位图来提高性能
通过避免自动缩放改善性能
读取图像元数据
从文件中读取图元数据
向文件中写入图元数据
使用图像编码器和解码器
列出已安装的编码器
列出已安装的解码器
获取解码器的类标识符
获取编码器的参数列表
将BMP图像转换为PNG图像
设定JPEG的压缩等级
对JPEG图像进行无损交换
创建和保存多帧图像
从多帧图像中复制单帧
Alpha混合线条和填充
绘制不透明和半透明的线条
用不透明和半透明的画笔绘制
使用复合模式控制Alpha混合
使用颜色矩阵设置图像中的Alpha值
设置单个像素的alpha值
使用字体和文本
构造字体系列和字体
绘制文本
格式化文本
枚举已安装的字体
创建专用的字体集合
获取字体规格
对文本使用消除锯齿效果
构造并绘制曲线
绘制基数样条曲线
绘制贝塞尔样条
用渐变画刷填充形状
创建线性渐变
创建路径渐变
将Gamma校正应用于渐变
构造并绘制路径
使用线条、曲线和形状创建图形
填充开放式图形
使用图形容器
管理Graphics对象的状态
Graphics状态
使用嵌套的Graphics容器
变换
使用世界变换
为什么变换顺序非常重要
使用区域
对区域进行点击检测
对区域进行剪辑
对图像重新着色
使用颜色矩阵对单色进行交换
转换图像颜色
缩放颜色
旋转颜色
剪取颜色
使用颜色重映射表
打印
将GDI+输出至打印机
显示一个打印对话框
通过提供打印机句柄优化打印
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 -
分享到:
收藏