MFC使用自定义资源加载PNG

转载 2013年12月03日 18:17:37

在MFC中,使用资源中的BMP是简单的,但是若是使用其他的图片资源,却是不容易的.
以下为解决办法.

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

#define IDB_BG                          131


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

IDB_BG                  RCPNG                   "res//背景.png"

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

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

/**///////////////////////////////////////////////////////////////////////////
/// 从资源文件中加载图片
/// @param [in] pImage 图片指针
/// @param [in] nResID 资源号
/// @param [in] lpTyp 资源类型
////////////////////////////////////////////////////////////////////////////*/
static bool LoadImageFromResource(IN CImage* pImage,
                           IN UINT nResID, 
                           IN LPCSTR lpTyp)
{
    if ( pImage == NULL) return false;

    pImage->Destroy();

    // 查找资源
    HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
    if (hRsrc == NULL) return false;

    // 加载资源
    HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
    if (hImgData == NULL)
    {
        ::FreeResource(hImgData);
        return false;
    }

    // 锁定内存中的指定资源
    LPVOID lpVoid    = ::LockResource(hImgData);

    LPSTREAM pStream = NULL;
    DWORD dwSize    = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
    HGLOBAL hNew    = ::GlobalAlloc(GHND, dwSize);
    LPBYTE lpByte    = (LPBYTE)::GlobalLock(hNew);
    ::memcpy(lpByte, lpVoid, dwSize);

    // 解除内存中的指定资源
    ::GlobalUnlock(hNew);

    // 从指定内存创建流对象
    HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
    if ( ht != S_OK )
    {
        GlobalFree(hNew);
    }
    else
    {
        // 加载图片
        pImage->Load(pStream);

        GlobalFree(hNew);
    }

    // 释放资源
    ::FreeResource(hImgData);

    return true;
}


在CImage类里面有一个方法CImage::

LoadFromResource,可是它实际上是调用到了

LoadImage这个方法,完全是没用滴.

有了以上的代码,然后就可以写逻辑代码了:

LoadImageFromResource(&m_ImaBg, IDB_BG, _T("RCPNG") );

 

参考资料:
供CImage类显示的半透明PNG文件处理方法
http://blog.sina.com.cn/s/blog_4070692f010003gy.html
强大的CImage类 http://www.cnblogs.com/s5689412/articles/149329.html

MFC使用自定义资源加载PNG

在MFC中,使用资源中的BMP是简单的,但是若是使用其他的图片资源,却是不容易的.以下为解决办法.首先,在Resource.h里面定义ID:#define IDB_BG                ...
  • okvee
  • okvee
  • 2010年03月23日 22:09
  • 9007

VC(MFC)在工具栏中使用PNG图片

----------------------------------------------------------------------------------------------------...
  • zhaoxiatengkong_1
  • zhaoxiatengkong_1
  • 2013年09月08日 17:40
  • 1188

MFC环境下显示透明PNG图片

工作需要又得使用MFC变调试软件。
  • wangsenmm
  • wangsenmm
  • 2014年04月25日 16:30
  • 2544

mfc中使用bmp和png位图

#include #include #pragma comment(lib,"gdiplus.lib") //全局对象 CImage m_Imagebmp; //bmp图片 Ima...
  • qq125096885
  • qq125096885
  • 2015年04月21日 10:45
  • 697

mfc picture控件显示png图片

onpaint函数里添加程序: CClientDC *pDC = new CClientDC(GetDlgItem(IDC_LIGHT)); CRect rect; GetDlgItem(IDC...
  • songyimin1208
  • songyimin1208
  • 2017年01月19日 14:31
  • 1154

MFC 在窗口上贴背景图png

1. 主窗口类 2. 基于CWnd
  • ying909175415
  • ying909175415
  • 2014年04月16日 21:02
  • 654

MFC 绘制 PNG 格式图片

//绘制子项图片 void CTreeCtrlBT::DrawItemImage(CRect rect, HTREEITEM hItem, CDC *pDc /* = NULL */) { if (...
  • qiangzi4646
  • qiangzi4646
  • 2016年01月26日 09:23
  • 1284

VC/MFC 将 数据/资源 放入resource中 (从resource加载 数据/资源)

    很多时候,我们程序(.exe,.dll)需要配合外部资源进行操作,譬如笔者有在写得 固件更新程序(FW update tool),需要将固件程序通过tool烧录到device中去。这其中通常我...
  • jtujtujtu
  • jtujtujtu
  • 2010年06月02日 19:57
  • 3833

mfc中图片控件上加载PNG图片

就一个加载png图片的程序弄了一下午,想哭。 1.在app.cpp中添加ULONG_PTR m_gdiplusToken;   2.在BOOL xxxApp::InitInstance()中添加 Gd...
  • webe1234
  • webe1234
  • 2017年06月21日 17:49
  • 776

MFC的PNG图片按钮

MFC的PNG图片按钮 #pragma once #include "afxwin.h" //////////////////////////////////////////////////...
  • x82488059
  • x82488059
  • 2015年07月02日 11:23
  • 1283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC使用自定义资源加载PNG
举报原因:
原因补充:

(最多只允许输入30个字)