gdi+ 1.1 配置与使用

来源:互联网 发布:无线网络优化薪资前景 编辑:程序博客网 时间:2024/06/05 09:05

1.概要
gdi+ 1.1增加了很多有用的函数,对应的文件为gdiplus.dll,一般放置在c:/windows/system32下面。
而gdiplus.dll的版本在Windows XP下面是5.0,即gdi+ 1.0,在vista下面是6.0,即gdi+1.1。
微软并没有发布独立的gdiplus.dll 6.0版本,所以擅自取出6.0的版本作为商业使用视为盗版,
故下面的叙述仅仅为了学习和研究gdi+ 1.1新特性。
2.文件获取
首先需要获取gdiplus.dll 6.0的版本,你可以下载 powerpoint viewer 2003来获取,安装之后在
C:/Program Files/Microsoft Office/PowerPoint Viewer下面有。
然后安装Windows SDK 6.0的版本,在微软的网站上下载 WindowsSDK_Vista_Feb2007 Update即可,
这个SDK里面其实已经包括支持gdi+ 1.1的头文件(header files)和库文件(library files)。
有了头文件、库文件、DLL文件,即可开始我们的GDI+ 1.1开发实践了。
3.WinSxS与DLL地狱
你可能会遇到这种情况,把自己辛辛苦苦编译的程序拿到别人的机器上运行,却发现弹出一个冷冰冰的提示: “由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”
当然,你不用浪费脑细胞去找什么配置问题,因为这压根和你的程序逻辑没有关系。
问题还是源自臭名昭著的”Dll Hell(动态库地狱)”问题,简单说,就是由于应用程序所需要的动态库可能会单独更新,而程序本身仅从文件名来识别动态库,于是造成版本混乱,甚至引起程序挂掉。比如说,通过vc编译出的c/c++程序大都会依赖微软的运行时库msvcr**.dll、msvcp**.dll、mfc**.dll等,这类文件在不同的操作系统上版本可能不同,所以从vc8开始,微软开始强制使用manifest文件用于说明PE文件的”依赖项”情况。
当XP以上操作系统运行这个程序运行时,会自动从当前目录和”%WinDir%/WinSxS”目录下寻找这个组合库的详细信息,即符合版本要求的”Microsoft.VC80.CRT.manifest”文件,如果找不到,操作系统就会抛出文章开始的“配置错误”异常。
所以,即便得到了最新版的gdiplus.dll,也不一定能够正确使用到。这点可以通过360安全卫士->高级->系统进程状态查看到你当前的exe使用的是哪个dll。
4.撰写manifest来控制DLL的使用
A.在vc++2008中,先将gdiplus.dll(6.0)拷贝到“项目所在目录/debug中”。
B.建立manifest,拷贝到项目所在目录/res中。内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity type="win32" name="Microsoft.Windows.GdiPlus" version="1.0.2600.5581" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df"/>
    <file name="GdiPlus.dll" hash="2c6f2780dcdf149c204fe7bcfb0e99dd07d9f82e" hashalg="SHA1"/>
</assembly>
C.查看项目属性->清单工具->输入和输出->附加清单文件->$(InputDir)//res//gdiplus.manifest
生成exe之后,会自动将此manifest的内容合并到exe中,当然,你也可以在debug目录下面找到XXX.manifest,用记事本打开,看看你添加的内容是否合并进去了。
5.配置开发环境
A.在stdafx.h添加:
// for GDI+ 1.1
#include <comdef.h>
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#include "GdiPlus.h"
using namespace Gdiplus;
#endif
#pragma comment(lib,"gdiplus.lib")
// end for GDI+ 1.1
B.在程序初始化的地方加入:
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
当然先要定义两个变量:
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_pGdiToken;
C.在程序卸载的地方加入:
GdiplusShutdown(m_pGdiToken);
6.OK啦
现在你可以开始使用GDI+ 1.1了,不是GDI+ 1.0哦。
包括一些特别有用的函数都可以使用,再也不用自己写了:
ConvertFormat
InitializePalette
...
对于MSDN上面关于GDI+方面的,注意到:
Stock Implementation:gdiplus.dll
HeaderDeclared in:GdiplusBitmap.h, include gdiplus.h
Import library:gdiplus.lib
Minimum availability:GDI+ 1.1
Minimum operating systems:Windows 98, Windows XP, Windows 2000, Windows NT 4.0 SP6
红色字体标注的地方,就是要求最低要求GDI+ 1.1。
期望本文对初学GDI+ 1.1的读者起到抛砖引玉的作用。