我在OnInitDialog()上尝试了以下代码,但没有显示任何内容。
m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));
其中m_staticLogo是静态图片控件,IDB_LOGO是png文件的资源ID。
答案 0 :(得分:16)
正如您所发现的那样,::LoadBitmap
(以及较新的::LoadImage
)仅处理.bmp
。到目前为止,最简单的解决方案是将图片转换为.bmp
。
如果图像具有透明度,则可以将其转换为32位ARGB位图(这是一个可以转换它的AlphaConv工具)。然后使用CImage
类LoadFromResource
方法加载图像。将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不确定。 或者,您可以试试以下内容。
答案 3 :(得分:0)
如果要将.png图像文件转换为.bmp格式,则最终可以获得图像清晰度。因此,在对话框类中捕获WM_PAINT消息并使用
Graphics :: DrawImage方法
要获取此方法,请将项目与gdiplus.lib库链接。