19.VC(ui)-加载图片资源的方法(随手代码)

15 篇文章 1 订阅
 
BOOL CImageManager::LoadResImage(UINT nResID,
								 LPCTSTR lpType,
								 Bitmap *&lpImage, 
								 HINSTANCE hInstance)
{
	lpImage  = NULL;

	hInstance = (NULL == hInstance) ? ::AfxGetResourceHandle() : hInstance;
	// If bmp,use system load.
	if (RT_BITMAP == lpType)
	{
		HBITMAP hBmp = ::LoadBitmap(hInstance, MAKEINTRESOURCE(nResID));
		lpImage = Bitmap::FromHBITMAP(hBmp, 0);
		::DeleteObject(hBmp);

		if (!lpImage)
		{
			TRACE("lpImage is NULL\n");
			return FALSE;
		}
		else
		{
			if (Gdiplus::Ok != lpImage->GetLastStatus())
			{
				TRACE("lpImage is error\n");
				return FALSE;
			}
			else
			{
				return TRUE;
			}
		}
	}

	// User-Defined

	HRSRC hRsrc = ::FindResource(hInstance, MAKEINTRESOURCE(nResID), lpType);
	if (!hRsrc)
	{
		TRACE("hRscs is NULL\n");
		return FALSE;
	}

	// Load resource into memory ---------------------------------
	DWORD len = ::SizeofResource(hInstance, hRsrc);

	BYTE *lpRsrc = (BYTE*)::LoadResource(hInstance, hRsrc);
	if (!lpRsrc)
	{
		TRACE("lpRsrc is NULL\n");
		return FALSE;
	}

	// Allocate global memory on which to create stream ----------
	HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, len);

	BYTE *pMem = (BYTE*)::GlobalLock(hMem);
	memcpy(pMem, lpRsrc, len);

	IStream *pStream = NULL;
	// You can query MSDN,why I use TRUE, -- hgy notes.
	HRESULT ht = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
	if (S_OK != ht)
	{
		TRACE("ht is error\n");
		return FALSE;
	}

	// Load from stream -------------------------------------------
	lpImage = Gdiplus::Bitmap::FromStream(pStream);

	// free/release stuff -----------------------------------------
	::GlobalUnlock(hMem);
	pStream->Release();
	::FreeResource(lpRsrc);

	if (!lpImage)
	{
		TRACE("lpImage is NULL\n");
		return FALSE;
	}
	else
	{
		if (Gdiplus::Ok != lpImage->GetLastStatus())
		{
			TRACE("lpImage is error\n");
			return FALSE;
		}
		else
		{
			return TRUE;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值