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的工具,可以对其进行转换).然后使用CImage类LoadFromResource方法加载图像.传递CImage给m_staticLogo.SetBitmap().
但如果你真的需要它.png,那就可以做到.
方法1(更简单的方法):使用加载.png文件CImage::Load.传递CImage给m_staticLogo.SetBitmap().
方法2(较硬的方式):装入.png通过装载资源到COM从资源IStream和使用CImage::Load.(注意:CImage::LoadFromResource看起来很诱人但不适用于.png图形).要将资源放入COM IStream,请参阅此Codeproject文章.请注意,该文章适用Gdiplus::Bitmap但关键部分是如何创建IStream,您应该能够适应CImage.最后,传递CImage给m_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 文件添加为资源,然后在面板中选择“导入”。