根據這些文件,以LoadFromResource它指出:如何從資源PNG加載到的CImage
從BITMAP資源
所以加載圖像,我有這個在我代碼:
rImage.LoadFromResource(AfxFindResourceHandle(), IDB_PNG1);
不起作用。然後我意識到我正在使用PNG文件而不是BMP文件。我認爲這是找不到資源的原因。
我也嘗試過使用AfxGetInstanceHandle()
。但是這也行不通。
因此,此刻我正在使用外部PNG文件。它工作正常。但有沒有任何方式來從資源中加載PNG到CImage
?
更新
提供給我的評論有幫助。
它導致我here。所以,如果我有這樣的方法:
IStream* CreateStreamOnResource(LPCTSTR lpName, LPCTSTR lpType)
{
IStream * ipStream = NULL;
HRSRC hrsrc = FindResource(NULL, lpName, lpType);
if (hrsrc == NULL)
goto Return;
DWORD dwResourceSize = SizeofResource(NULL, hrsrc);
HGLOBAL hglbImage = LoadResource(NULL, hrsrc);
if (hglbImage == NULL)
goto Return;
LPVOID pvSourceResourceData = LockResource(hglbImage);
if (pvSourceResourceData == NULL)
goto Return;
HGLOBAL hgblResourceData = GlobalAlloc(GMEM_MOVEABLE, dwResourceSize);
if (hgblResourceData == NULL)
goto Return;
LPVOID pvResourceData = GlobalLock(hgblResourceData);
if (pvResourceData == NULL)
goto FreeData;
CopyMemory(pvResourceData, pvSourceResourceData, dwResourceSize);
GlobalUnlock(hgblResourceData);
if (SUCCEEDED(CreateStreamOnHGlobal(hgblResourceData, TRUE, &ipStream)))
goto Return;
FreeData:
GlobalFree(hgblResourceData);
Return:
return ipStream;
}
,並調用它是這樣的:
rImage.Load(CreateStreamOnResource(MAKEINTRESOURCE(IDB_PNG1), _T("PNG")));
工作正常...謝謝你們。
更新:
根據提供的評論。現在好多了?我看不出有任何的泄漏:
IStream *pStream = CreateStreamOnResource(MAKEINTRESOURCE(uPNGResourceID), _T("PNG"));
if (pStream != nullptr)
{
rImage.Load(pStream);
rImage.SetHasAlphaChannel(true);
pStream->Release();
}
附註:我真的需要調用SetHasAlphaChannel
如果這些都是我自己的嵌入式資源和我知道的是透明的32個資源?
相關:[加載png資源到CBitMap](https://stackoverflow.com/questions/3005685/load-a-png-resource-into-a-cbitmap) – sergiol
不。你有內存泄漏。你必須調用Release到IStream接口。或者您使用CComPtr作爲返回值。 –
xMRi
正如我所說的使用CComPtr會使它更容易...我假設你只需要將聲明更改爲CComPtr ipStream;當然還有返回值。比rImage。Load(CreateStreamOnResource(MAKEINTRESOURCE(IDB_PNG1),_T(「PNG」)));將是可能的。 –
xMRi