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进行任何的写操作都将失败。
微软的帮助文档里写的很清楚。
Bitmaps returned from LoadBitmap are not writable. All calls to write to a bitmap returned by the LoadBitmap function will fail
if(m_hbackground!=NULL)
{
HDC dc = CreateCompatibleDC(hdc);
HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, this->m_hbackground);
//set background transparent
int bk_mode=SetBkMode(dc,TRANSPARENT);
//set font
LOGFONT lf;
HFONT hFontNew, hFontOld;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = this->m_size.cy ;
lf.lfWidth = 0;//this->m_size.cx ;
hFontNew = CreateFontIndirect(&lf);
hFontOld = (HFONT) SelectObject(dc, hFontNew);
//make char center
RECT rect ;
rect.left = this->m_position.x ;
rect.right = this->m_position.x + this->m_size.cx ;
rect.top = this->m_position.y ;
rect.bottom = this->m_position.y + this->m_size.cy ;
//m_Char 是一个WCHAR型成员变量,已经初始化了
DrawText(dc,&m_Char,1,&rect,DT_VCENTER|DT_CENTER|DT_NOCLIP);
BitBlt(
hdc,
this->m_position.x ,
this->m_position.y ,
this->m_size.cx ,
this->m_size.cy ,
dc ,
0, 0 ,
SRCCOPY);
SelectObject(hdc, hFontOld);
DeleteObject(hFontNew);
SelectObject(dc, oldBitmap );
SetBkMode(dc, bk_mode);
DeleteDC(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.
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/jinhaijian/archive/2009/09/24/4589975.aspx