博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC使用自定义资源加载PNG
阅读量:6934 次
发布时间:2019-06-27

本文共 1390 字,大约阅读时间需要 4 分钟。

在MFC中,使用资源中的BMP是简单的,但是若是使用其他的图片资源,却是不容易的.

以下为解决办法.


首先,在Resource.h里面定义ID:

None.gif
#define IDB_BG                          131

然后在rc文件里面添加代码:

None.gifIDB_BG                  RCPNG                   "res\\背景.png"
其中,RCPNG为自定义资源类型的名称,当然,至于你需要如何去命名就是你的事情了.


然后我们需要CImage这个ATL类,以及以下这个方法:

ExpandedBlockStart.gif
//
InBlock.gif
///
 从资源文件中加载图片
InBlock.gif
///
 @param [in] pImage 图片指针
InBlock.gif
///
 @param [in] nResID 资源号
InBlock.gif
///
 @param [in] lpTyp 资源类型
ExpandedBlockEnd.gif
//
None.gif
static 
bool LoadImageFromResource(IN CImage* pImage,
None.gif                           IN UINT nResID, 
None.gif                           IN LPCSTR lpTyp)
ExpandedBlockStart.gif {
InBlock.gif    
if ( pImage == NULL) 
return 
false;
InBlock.gif
InBlock.gif    pImage->Destroy();
InBlock.gif
InBlock.gif    
//
 查找资源
InBlock.gif
    HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
InBlock.gif    
if (hRsrc == NULL) 
return 
false;
InBlock.gif
InBlock.gif    
//
 加载资源
InBlock.gif
    HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
InBlock.gif    
if (hImgData == NULL)
ExpandedSubBlockStart.gif    {
InBlock.gif        ::FreeResource(hImgData);
InBlock.gif        
return 
false;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
//
 锁定内存中的指定资源
InBlock.gif
    LPVOID lpVoid    = ::LockResource(hImgData);
InBlock.gif
InBlock.gif    LPSTREAM pStream = NULL;
InBlock.gif    DWORD dwSize    = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
InBlock.gif    HGLOBAL hNew    = ::GlobalAlloc(GHND, dwSize);
InBlock.gif    LPBYTE lpByte    = (LPBYTE)::GlobalLock(hNew);
InBlock.gif    ::memcpy(lpByte, lpVoid, dwSize);
InBlock.gif
InBlock.gif    
//
 解除内存中的指定资源
InBlock.gif
    ::GlobalUnlock(hNew);
InBlock.gif
InBlock.gif    
//
 从指定内存创建流对象
InBlock.gif
    HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
InBlock.gif    
if ( ht != S_OK )
ExpandedSubBlockStart.gif    {
InBlock.gif        GlobalFree(hNew);
ExpandedSubBlockEnd.gif    }
InBlock.gif    
else
ExpandedSubBlockStart.gif    {
InBlock.gif        
//
 加载图片
InBlock.gif
        pImage->Load(pStream);
InBlock.gif
InBlock.gif        GlobalFree(hNew);
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
//
 释放资源
InBlock.gif
    ::FreeResource(hImgData);
InBlock.gif
InBlock.gif    
return 
true;
ExpandedBlockEnd.gif}

在CImage类里面有一个方法CImage::
LoadFromResource,可是它实际上是调用到了LoadImage这个方法nugget.gif,完全是没用滴.
有了以上的代码,然后就可以写逻辑代码了:
None.gifLoadImageFromResource(&m_ImaBg, IDB_BG, _T("RCPNG") );

转载地址:http://ouznl.baihongyu.com/

你可能感兴趣的文章
【leetcode】944. Delete Columns to Make Sorted
查看>>
thinkphp 查找表并返回结果
查看>>
MySQL应用
查看>>
Android--百度地图密钥申请+环境配置(一)
查看>>
第四周学习报告
查看>>
setPreferredSize和setSize的区别及用法
查看>>
[C++再学习系列] 引用和指针
查看>>
栈的应用
查看>>
java POI Excel 单元格样式
查看>>
【原】iOS学习之UITabBar的隐藏
查看>>
android 学习随笔十二(网络:使用异步HttpClient框架)
查看>>
最短路的那些有趣的模型(不定期更新)
查看>>
mint 13 安装 phpunit
查看>>
连续性2
查看>>
<TCP/IP>记一次关于IP地址和MAC物理地址的思考
查看>>
arp
查看>>
python 爬预警没解析前的
查看>>
ubuntu查看硬件信息
查看>>
android点滴(25)之 original-package
查看>>
android点滴 之 进度条
查看>>