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

dav*_*led 12 c++ mfc png visual-studio

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

m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ate 16

正如你所发现的,::LoadBitmap(和更新的::LoadImage)只处理.bmps.到目前为止,最简单的解决方案是将图像转换为.bmp.

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

但如果你真的需要它.png,那就可以做到.

方法1(更简单的方法):使用加载.png文件CImage::Load.传递CImagem_staticLogo.SetBitmap().

方法2(较硬的方式):装入.png通过装载资源到COM从资源IStream和使用CImage::Load.(注意:CImage::LoadFromResource看起来很诱人但不适用于.png图形).要将资源放入COM IStream,请参阅此Codeproject文章.请注意,该文章适用Gdiplus::Bitmap但关键部分是如何创建IStream,您应该能够适应CImage.最后,传递CImagem_staticLogo.SetBitmap().

编辑:更新以使用CImage,这比使用起来更容易Gdiplus::Bitmap.


小智 5

对于那些需要快速解决方案的人,这里有一种使用 GDI+ 从资源加载 png 文件的方法(标准 GDI 的原始答案来自此处 - http://www.codeproject.com/Questions/377803/How-to-load-PNG -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;
}
Run Code Online (Sandbox Code Playgroud)

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