分类: WINDOWS
2010-12-17 14:50:47
SHLoadDIBitmap和LoadBitmap和LoadImage返回的设置无关(device independent )的位图。而SHLoadImageFile和SHLoadImageResource返回的是设置相关(device dependent)位图。
SHLoadImageFile:
读取一个图片,然后解码,最后返回device dependent的HBITMAP。在SHLoadImageFile是调用IImage和IBitmapImage来实现的,我们也很容易去实现。大概步骤是。
调用CreateImageFromFile来获取IImage接口。
调用CreateBitmapFromImage获取IBitmapImage
调用LockBits,设置PixelFormatID 为PixelFormat16bppRGB565。这样就解码返回位图信息了。
调用CreateCompatibleBitmap,把LockBits返回的buffer,copy到当前位图中。
优点:
是可以支持PNG、JPG、GIF、BMP等,只要有相应的解码接口,就可以返回HBITMAP。
缺点:
如果我们去加载一个位图,那么无论你原来的位图是什么格式的,他都将转成RGB565格式的。这样我们对于图片格式有特殊要求的时候,就不能用这个接口了。因为要做解码工作(bmp图片需要做格式转换),SHLoadImageFile加载位图要比SHLoadDIBitmap慢。
SHLoadImageResource:
SHLoadImageResource跟SHLoadImageFile非常相似,只是一个从资源中加载一个从目录加载。
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.