在WindowsMobile中使用GDI+

来源:互联网 发布:mac怎么卸载输入法 编辑:程序博客网 时间:2024/05/17 00:57

以下网上搜到的方法。

从WM5.0以后,WM就开始支持GDI+了,这个可以从以下几方面证明:

首先是.net可以引用GDI+,其次 是在wm5.0的ROM中找到gdiplus.dll,还有就是在wm5.0以后的SDK有gdiplus的部分的.h文件,gdiplusenums.h和gdiplusimaging.h。但这些.h文件不全,只有一部分,是关于图像编码的。怎么样才能在wm5.0平台上使用原生的gdi+的API呢?我想了一些办法。

首先,gdi+是gdi发展的高级产物,它是对gdi发展和完善,它主要表现在两个方面,一是功能丰富,它引入大量的gdi所不具备的功能,如图形旋转,矩阵操作,样条曲线等。二是使用简便,不用再选出选入,对象销毁,关于怎么使用和如何GDI+的话题,这里是比较全的,但这里一是在window下的,二是大部分例子是delphi下的,但我觉得很全面,也很有借鉴意义。

gdi+实际是两部分,一个是gdiplus.dll,它是gdi+的实现部分。第二部分是封装层。DLL只是实现了功能 ,也就所谓的flat api,如何使之更易于使用就要通过封装所以才会有多达数十个的头文件,所谓的gdiplus.h只是引用诸多的gdiplusXXXXX.h。要在编程中隐式地引用gdi+还要有个lib,这个是SDK中没有的。

我查了下,可以通过DLL得到lib,这里说得很详细。

照着操作,我是VS2008,dumpbin总是运行不了,原来还要运行下vcvarsall.bat对参数进行下初始化才行。

然后就得到了dll输出表,一共输出了609个函数。生成库文件。

这里说下lib在不同平台下是不一样的,我认为应该使用VS2008安装目录下的/VC/ce/bin/x86_arm目录的lib才行,我的参数是 lib /def:gdiplus.def /machine:arm /subsystem:windowsce,运行成功。我想再把这个库和桌面平台下所有的gdiplus打头的.h文件引用过来,应该就行了吧。但这个我还没有试验,能不能成功我也不没把握。

可能存在两个问题一是移动版的有些功能没有实现,二是有些封装不是仅仅靠.h文件就行的,应该还需要一些代码。这里也是个参考,不过是E文。
上次我试验了我的劳动成果,证明是不行的。不过这里有人给出一个可以实用的版本。我来说下我的试用成果。

一、安装

附件中是手机开发GDI+程序时使用的头和库。支持WinCE5.0, WinCE6.0, VC++代码,非C#封装。附有源码。http://www.pudn.com/downloads196/sourcecode/windows/bitmap/detail922379.html下载后,将文件复制到相应的文件夹中,inlcude文件我是到Windows Mobile 6 SDK/PocketPC/Include/Armv4i/GDI+(我只试用了WM^下)下,这样出问题好处理。lib文件到/Windows Mobile 6 SDK/PocketPC/Lib/Armv4i下。在引用路径也要加上这些路径。

二、准备

首先在头文件中加入

include <gdiplus.h>
using   namespace   Gdiplus;

#pragma   comment   (lib,   "LibGDIPlus.lib")

在Oncreat事件中,调用

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

进行初始化。在Ondestory事件中调用

GdiplusShutdown(gdiplusToken);

进行结束。

可以将gdiplusToken设为公用变量,这样可以不出问题。但初始化不能在DLL中进行,不知道是为什么 。

三、使用

wince下的GDI+有好多功能没有实现:

No support to load image file directly from path
Use IStream interface to load file data, use the stream interface version to create bitmap. Same goes for resource.
Windows Mobile doesn't support the following features:
GDI Path (GDI path functions are not exported)
Enhanced Meta file
前一个我认为可这样解决一是使用ISTREAM但比较复杂,二是使用GDI

m_bt=new Bitmap(::SHLoadImageFile(_T("//Program Files//aaa.png"),0);但支持范围有限。

后面的我没试过。

在试用中还发现些问题,比较重要的Drawimgae有18函数只有下面6个实现了

        Graphics::rawImage(Image*,RectF&)
        Graphics::rawImage(Image*,INT,INT,INT,INT)
        Graphics::rawImage(Image*,PointF*,INT,REAL,REAL,REAL,REAL,Unit,ImageAttributes*,DrawImageAbort,VOID*)
        Graphics::rawImage(Image*,REAL,REAL,REAL,REAL)
        Graphics::rawImage(Image*,Rect&)

        Graphics::rawImage(Image*,RectF&,REAL,REAL,REAL,REAL,Unit,ImageAttributes*,DrawImageAbort,VOID*)
这两个干脆没有原型

Graphics::rawImage(Image*,RectF&,RectF&,Unit,ImageAttributes*)
Graphics::rawImage(Image*,RectF*,Matrix*,Effect*,ImageAttributes*,Unit*)
不过主要功能还是能实现了。还有就是RotateTransform也不支持,这个就比较苦恼了。

原创粉丝点击