MFC怎么加载路径中的png图像

MFC怎么加载路径中的png图像,第1张

首先,在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

}

补充:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

你可以使用MFC的CImage类,该类的头文件是atlimage.h

下面是示例代码:

CDC *pDC = GetDC()

CImage Image

Image.Load(strPath)

if (Image.IsNull())

{

    MessageBox(_T("没加载成功"))

    return -1

}

if (Image.GetBPP() == 32) //确认该图像包含Alpha通道

{

    int i

    int j

    for (i = 0 i < Image.GetWidth() i++)

    {

        for (j = 0 j < Image.GetHeight() j++)

        {

            byte *pByte = (byte *)Image.GetPixelAddress(i, j)

            pByte[0] = pByte[0] * pByte[3] / 255

            pByte[1] = pByte[1] * pByte[3] / 255

            pByte[2] = pByte[2] * pByte[3] / 255

        }

    }

}

Image.Draw(pDC->m_hDC, 0, 0)

Image.Destroy()

ReleaseDC(pDC)

注意使用CImage,对于带alpha通道数据的图片要特别处理一下,上面的示例中,双循环体就是做的这个事情,你可以参考。

CImage类功能比CBitmap强大很多,支持的图片格式为:jpg,png,bmp,gif (注意:VC6.0中不支持CImage,推荐使用VS2005/2008/2010) 显示图片的方法很简单: 首先包含头文件:atlimage.h CImage img//定义变量,最好定义为类的成员变量


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11378015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存