我在OnInitDialog()上試過下面的代碼,但沒有顯示任何內容。如何在對話框的圖片控件中加載png資源?
m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));
其中m_staticLogo是靜態圖片控件,IDB_LOGO是png文件的資源ID。
我在OnInitDialog()上試過下面的代碼,但沒有顯示任何內容。如何在對話框的圖片控件中加載png資源?
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
,請參閱this Codeproject article。請注意,該文章與Gdiplus::Bitmap
一起工作,但關鍵部分是如何創建IStream
,您應該能夠適應CImage
。最後,通過CImage
到m_staticLogo.SetBitmap()
。
編輯:更新使用CImage
,比Gdiplus::Bitmap
容易。
我將png文件轉換爲bmp,但問題是轉換後圖像的背景不再透明。有什麼方法可以轉換並保持透明背景嗎? – 2010-10-22 03:19:47
方法1可以工作,但我更願意在資源文件中有圖形。方法2對我來說太困難了。 – 2010-10-22 03:23:24
您可以通過將'.png'轉換爲32位「ARGB」'.bmp'來保持透明度。像Paint.NET這樣的標準工具不會這樣做。我已經使用可用的工具更新了文章。在Visual Studio中查看時可能看起來很奇怪,但渲染正常。這對單色背景很有效。如果你有像照片一樣的複雜背景,它將不起作用。 – Nate 2010-10-22 09:10:02
它支持的位圖和圖標。不確定png。或者,也可以嘗試以下方法。
如果您要將.png圖像文件轉換爲.bmp格式,最終可能會導致圖像清晰。所以,趕上WM_PAINT消息對話框類,並使用
圖形::的DrawImage方法
要獲得此法gdiplus.lib庫鏈接您的項目。
對於這些,誰需要快速的解決方案,這裏是加載使用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文件作爲資源使用添加資源命令並在面板中選擇導入。
重複的http://stackoverflow.com/questions/3005685/ – ulatekh 2013-11-19 21:49:56