如何将png资源加载到对话框的图片控件中?

时间:2010-10-21 14:23:26

标签: c++ visual-studio mfc png

我在OnInitDialog()上尝试了以下代码,但没有显示任何内容。

m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));

其中m_staticLogo是静态图片控件,IDB_LOGO是png文件的资源ID。

4 个答案:

答案 0 :(得分:16)

正如您所发现的那样,::LoadBitmap(以及较新的::LoadImage)仅处理.bmp。到目前为止,最简单的解决方案是将图片转换为.bmp

如果图像具有透明度,则可以将其转换为32位ARGB位图(这是一个可以转换它的AlphaConv工具)。然后使用CImageLoadFromResource方法加载图像。将CImage传递给m_staticLogo.SetBitmap()

但如果您真的需要它是.png,那么就可以完成。

方法1(更简单的方法):使用.png从文件加载CImage::Load。将CImage传递给m_staticLogo.SetBitmap()

方法2(更难的方法):通过将资源加载到COM .png并使用IStream,从资源加载CImage::Load。 (注意:CImage::LoadFromResource看起来很诱人但不适用于.png图形。要将资源转换为COM IStream,请参阅this Codeproject article。请注意,该文章适用于Gdiplus::Bitmap,但关键部分是如何创建IStream,您应该能够适应CImage。最后,将CImage传递给m_staticLogo.SetBitmap()

修改:已更新以使用CImage,这比Gdiplus::Bitmap更容易。

答案 1 :(得分:3)

对于那些需要快速解决方案的人来说,这是一种使用GDI +从资源加载png文件的方法(标准GDI的原始答案来自此处 - http://www.codeproject.com/Questions/377803/How-to-load-PNG-images-in-mfc):

bool GdiPlusUtils::LoadBitmapFromPNG(UINT uResourceID, 
    Bitmap** ppBitmapOut, HINSTANCE hInstance /*= NULL*/)
{
    bool bRet = false;

    if (!hInstance)
        hInstance = AfxGetInstanceHandle();

    HRSRC hResourceHandle = ::FindResource(
        hInstance, MAKEINTRESOURCE(uResourceID), L"PNG");
    if (0 == hResourceHandle)
    {
        return bRet;
    }

    DWORD nImageSize = ::SizeofResource(hInstance, hResourceHandle);
    if (0 == nImageSize)
    {
        return bRet;
    }

    HGLOBAL hResourceInstance = ::LoadResource(hInstance, hResourceHandle);
    if (0 == hResourceInstance)
    {
        return bRet;
    }

    const void* pResourceData = ::LockResource(hResourceInstance);
    if (0 == pResourceData)
    {
        FreeResource(hResourceInstance);
        return bRet;
    }

    HGLOBAL hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, nImageSize);
    if (0 == hBuffer)
    {
        FreeResource(hResourceInstance);
        return bRet;
    }

    void* pBuffer = ::GlobalLock(hBuffer);
    if (0 != pBuffer)
    {
        CopyMemory(pBuffer, pResourceData, nImageSize);
        IStream* pStream = 0;
        if (S_OK == ::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream))
        {
            *ppBitmapOut = new Bitmap(pStream);
            pStream->Release();
            bRet = true;
        }
        ::GlobalUnlock(hBuffer);
    }
    ::GlobalFree(hBuffer);

    UnlockResource(hResourceInstance);
    FreeResource(hResourceInstance);

    return bRet;
}

您可以使用“添加资源”命令将png文件添加为资源,然后在面板中选择“导入”。

答案 2 :(得分:1)

它支持的位图和图标。 png不确定。 或者,您可以试试以下内容。

  1. 在MS Paint或其他观看者中打开png。
  2. 然后从中复制图像部分。
  3. 在MFC资源中创建资源。
  4. 将复制的图像粘贴到新创建的资源。
  5. 在LoadBitmap中使用新资源ID。

答案 3 :(得分:0)

如果要将.png图像文件转换为.bmp格式,则最终可以获得图像清晰度。因此,在对话框类中捕获WM_PAINT消息并使用

Graphics :: DrawImage方法

要获取此方法,请将项目与gdiplus.lib库链接。