SHLoadImageFile、SHLoadDIBitmap、LoadBitmap、LoadImage、SHLoadImageResource函数联系和区别

SHLoadImageFileSHLoadDIBitmapLoadBitmapLoadImageSHLoadImageResource函数联系和区别

 

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进行任何的写操作都将失败。

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

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.

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值