MFC使用自定义资源加载PNG

简介:
在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") );
目录
相关文章
|
安全
WKWebView加载PDF屏蔽长按功能弹框
近期有个需求,需要在WKWebView加载PDF中,基于安全的理由,屏蔽【复制、选择全部】等功能弹窗
131 0
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(一)
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(一)
386 0
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(一)
|
Dart 开发者
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(二)
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(二)
254 0
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(二)
PyQt5 图形界面 - Qt Designer创建qrc资源文件引用图片资源实例演示,QTextBrower组件引用图片资源方法展示
PyQt5 图形界面 - Qt Designer创建qrc资源文件引用图片资源实例演示,QTextBrower组件引用图片资源方法展示
379 0
PyQt5 图形界面 - Qt Designer创建qrc资源文件引用图片资源实例演示,QTextBrower组件引用图片资源方法展示
|
缓存 Swift iOS开发
iOS开发swift版异步加载网络图片(带缓存和缺省图片)
iOS开发swift版异步加载网络图片(带缓存和缺省图片)
433 0
|
XML 程序员 C语言
Qt编写控件属性设计器1-加载插件
一、前言 加载插件是整个属性设计器的第一步要打通的功能,插件中的控件都加载不了,后面就别搞别玩下去了没法玩的,要从一个动态库中加载出来控件,肯定需要用到反射机制,以前做.NET开发的时候就觉得反射这个东西相当强大,居然可以读取DLL加载出来控件,现在用Qt,发现Qt也有反射机制,也许这东东可能各大.
1011 0
|
开发工具 C语言
Qt编写自定义控件35-GIF录屏控件
一、前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基本上都支持gif动图,一般一个5秒左右的gif,800*600分辨率,可以很好的控制在500KB内,这样就比较完美的支持各大网站上传动图。
960 0
|
C#
WPF调用图片路径,或资源图片
原文:WPF调用图片路径,或资源图片 一、加载本项目的图片WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源。其中较为常见的情况是用Uri加载图像。
2342 0
|
C# 数据格式 XML
UWP应用载入SVG图片的兼容性方案
原文 UWP应用载入SVG图片的兼容性方案 新版本《纸书科学计算器》的更新点之一,就是优化了表达式的显示方式。在旧版本中,表达式里的符号是用png图片显示的,当用户放大看的时候会发现一些锯齿,非常影响使用体验。
1293 0