从资源中加载特殊资源方法

本文介绍了如何在资源中加载GIF、PNG、ANI等特殊资源,提供了加载动态图标的MFC方法,特别指出在DLL中加载某些包含alpha通道的ANI可能会失败。还分享了一种简单的MFC EXE程序中加载ANI资源的方式,并提及了使用GDI+加载GIF和PNG图片的方法。

在资源中保存了GIF,PNG,ANI等等资源时怎样加载呢?

可以使用如下方法

加载动态图标(光标)的方法

注意再将光标导入到资源时候资源类型输入ANI

// 在一般mfc程序中使用
//HINSTANCE hInstance = AfxGetInstanceHandle();
// 如果是atlcom组件中使用
//HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance();
HCURSOR LoadAniCursor(HINSTANCE hInstance, UINT nID)
{
    HRSRC hRes 
= FindResource(hInstance, MAKEINTRESOURCE(nID), L"ANI");
    
if (hRes == NULL)
    
{
        ATLTRACE(
"cannot find resource errcode: %d", GetLastError());
        
return NULL;
    }

    DWORD dwSize 
= SizeofResource(hInstance, hRes);
    HGLOBAL hGlob 
= LoadResource(hInstance, hRes);
    
if (hGlob == NULL)
    
{
        ATLTRACE(
"cannot Load resource errcode: %d", GetLastError());
        
return NULL;
    }

    LPBYTE pBytes 
= (LPBYTE)LockResource(hGlob); 
    HCURSOR hCursor 
= (HCURSOR)CreateIconFromResource(pBytes, dwSize, FALSE, 0x00030000);
    
if (hCursor == NULL)
    
{
        ATLTRACE(
"cannot create ani cursor errcode: %d", GetLastError());
        
return NULL;
    }

    UnlockResource(hGlob);
    FreeResource(hRes);
    
return hCursor;
}


//成功调用
SetCursor(hAniCursor);

 

上面的方法在非dll(包括ATL com Dll)的普通应用程序中使用是没有问题的。在dll中使用时某些ani(可能有alpha通道32位以上)的加载可能不成功。

 

另外介绍一种在MFC exe程序中使用的最简单的方法在加入ani 文件到资源中时候资源类型输入21( ATL_RT_ANICURSOR的值

加载的方法可以为:

  1.     HCURSOR hAniCur = ::LoadCursor(AfxFindResourceHandle(ATL_MAKEINTRESOURCE(IDR_ANI1),
  2.         ATL_RT_ANICURSOR), ATL_MAKEINTRESOURCE(IDR_ANI1)); 

GIF PNG  图片加载方法(使用了GDI+)

BOOL ImageFromIDResource(HINSTANCE hInstance, UINT nID, LPCTSTR sTR, Image * &pImg)
{
    HRSRC hRsrc 
= ::FindResource (hInstance, MAKEINTRESOURCE(nID), sTR); // type
    if (!hRsrc)
        
return FALSE;

    
// load resource into memory
    DWORD len = SizeofResource(hInstance, hRsrc);
    BYTE
* lpRsrc = (BYTE*)LoadResource(hInstance, hRsrc);
    
if (!lpRsrc)
        
return FALSE;

    
// Allocate global memory on which to create stream
    HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
    BYTE
* pmem = (BYTE*)GlobalLock(m_hMem);
    memcpy(pmem,lpRsrc,len);
    IStream
* pstm;
    CreateStreamOnHGlobal(m_hMem,FALSE,
&pstm);

    
// load from stream
    pImg = Gdiplus::Image::FromStream(pstm);

    
// free/release stuff
    GlobalUnlock(m_hMem);
    pstm
->Release();
    FreeResource(lpRsrc);
    
return TRUE;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值