wince下的GDI+。
说错了是WM下,从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文。
一、安装
下载后,将文件复制到相应的文件夹中,inlcude文件我是到Windows Mobile 6 SDK\PocketPC\Include\Armv4i\GDI+(我只试用了WM^下)下,这样出问题好处理。lib文件到\Windows Mobile 6 SDK\PocketPC\Lib\Armv4i下。在引用路径也要加上这些路径。
二、准备
首先在头文件中加入
include
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::DrawImage(Image*,RectF&)
Graphics::DrawImage(Image*,INT,INT,INT,INT)
Graphics::DrawImage(Image*,PointF*,INT,REAL,REAL,REAL,REAL,Unit,ImageAttributes*,DrawImageAbort,VOID*)
Graphics::DrawImage(Image*,REAL,REAL,REAL,REAL)
Graphics::DrawImage(Image*,Rect&) Graphics::DrawImage(Image*,RectF&,REAL,REAL,REAL,REAL,Unit,ImageAttributes*,DrawImageAbort,VOID*)
这两个干脆没有原型
Graphics::DrawImage(Image*,RectF&,RectF&,Unit,ImageAttributes*)
Graphics::DrawImage(Image*,RectF*,Matrix*,Effect*,ImageAttributes*,Unit*)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21917021/viewspace-607901/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21917021/viewspace-607901/