[英]How to load a png resource into picture control on a dialog box?
我在OnInitDialog()上嘗試了以下代碼,但沒有顯示任何內容。
m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));
其中m_staticLogo是靜態圖片控件,IDB_LOGO是png文件的資源ID。
正如您所發現的, ::LoadBitmap
(和較新的::LoadImage
)僅處理.bmp
。 到目前為止,最簡單的解決方案是將圖像轉換為.bmp
。
如果圖像具有透明度,則可以將其轉換為32位ARGB位圖(這是一個名為AlphaConv的工具,可以對其進行轉換)。 然后使用CImage
類LoadFromResource
方法加載圖像。 將CImage
傳遞給m_staticLogo.SetBitmap()
。
但如果你真的需要它是一個.png
,它就可以完成。
方法1(更簡單的方法):使用CImage::Load
從文件加載.png
。 將CImage
傳遞給m_staticLogo.SetBitmap()
。
方法2(更難的方法):通過將資源加載到COM IStream
並使用CImage::Load
從資源加載.png
。 (注意: CImage::LoadFromResource
看起來很誘人但不適用於.png
圖形)。 要將資源放入COM IStream
,請參閱此Codeproject文章 。 請注意,本文適用於Gdiplus::Bitmap
但關鍵部分是如何創建IStream
,您應該能夠適應CImage
。 最后,將CImage
傳遞給m_staticLogo.SetBitmap()
。
編輯:更新以使用CImage
,這比Gdiplus::Bitmap
更容易。
對於那些需要快速解決方案的人來說,這是一種使用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文件添加為資源,然后在面板中選擇“導入”。
它支持的位圖和圖標。 png不確定。 或者,可以嘗試以下方法。
如果要將.png圖像文件轉換為.bmp格式,則最終可以獲得圖像清晰度。 因此,在對話框類中捕獲WM_PAINT消息並使用
Graphics :: DrawImage方法
要獲取此方法,請將項目與gdiplus.lib庫鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.