ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Wince下的GDI+

Wince下的GDI+

原创 Linux操作系统 作者:warchief_dx 时间:2009-06-30 15:28:56 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-18

  • 博文量
    36
  • 访问量
    25502