Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1218969
  • 博文数量: 233
  • 博客积分: 6270
  • 博客等级: 准将
  • 技术积分: 1798
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 08:32
文章分类

全部博文(233)

文章存档

2011年(31)

2010年(202)

我的朋友

分类: WINDOWS

2010-12-17 14:50:47

SHLoadDIBitmapLoadBitmapLoadImage返回的设置无关(device independent )的位图。而SHLoadImageFileSHLoadImageResource返回的是设置相关(device dependent)位图。

 

SHLoadImageFile

    读取一个图片,然后解码,最后返回device dependentHBITMAP。在SHLoadImageFile是调用IImageIBitmapImage来实现的,我们也很容易去实现。大概步骤是。

调用CreateImageFromFile来获取IImage接口。

调用CreateBitmapFromImage获取IBitmapImage

调用LockBits,设置PixelFormatID PixelFormat16bppRGB565。这样就解码返回位图信息了。

调用CreateCompatibleBitmap,把LockBits返回的buffercopy到当前位图中。

优点:

是可以支持PNGJPGGIFBMP等,只要有相应的解码接口,就可以返回HBITMAP

缺点:

如果我们去加载一个位图,那么无论你原来的位图是什么格式的,他都将转成RGB565格式的。这样我们对于图片格式有特殊要求的时候,就不能用这个接口了。因为要做解码工作(bmp图片需要做格式转换)SHLoadImageFile加载位图要比SHLoadDIBitmap慢。

 

SHLoadImageResource

    SHLoadImageResourceSHLoadImageFile非常相似,只是一个从资源中加载一个从目录加载。

 

SHLoadDIBitmap:

    从目录加载位图,返回Device Independent 位图。

 

LoadBitmap:

    从资源加载位图,返回Device Independent 位图。WINCE 的设计为了节省内存,从资源中加载的位图不进行内存的复制,位图buffer直接用的是进程内静态资源区域的空间。所以我们如果试图通过GetOject来返回BITMAP,去操作bmBits是不可行的,bmBits返回空。

之前在网上看到有人写了如下一段代码, 问“windouws mobile下没有出来,但是显示出位图了,在windows下没问题。”N多人回答是DrawText的问题,我想问问题的人还不至于这么弱智,如果是Drawtext的问题,随便测试下就检查出来了。实际上是把不可写的位图选进了DC, 那么试图对这个DC进行任何的写操作都将失败。

微软的帮助文档里写的很清楚。

 

LoadImage:

    从资源中加载图片,返回Device Independent 位图。支持BMP,CURSOR,ICON。返回的对象也是不可写的。

Bitmaps returned from LoadImage are not writable. All calls to write to a bitmap returned by the LoadImage function will fail.

阅读(1137) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~