1.利用系统 LoadBitmap接口加载位图
注意:程序应该调用DeleteObject删除LoadBitmap返回的每一个句柄
HBITMAP LoadBitmap(HINSTANCE hInstance,LPCTSTR lpBitmapName);
参数一:模块实例句柄 AfxGetInstanceHandle()
参数二:指向字符串(以NULL结束)批指针。该字符串包含了要加载的位图资源名称。另外一种方式就是该参数可以由低位字是资源标识符、高位字为0位形式组成。可以使用宏MAKEINTRESOURCE来创建这个参数值
用例:
//利用MAKEINTRESOURCE宏
hbmp = ::Loadbitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BMP));
//字符串形式
hbmp = ::Loadbitmap(AfxGetInstanceHandle(),(LPCTSTR)IDB_BMP);
/*加载预定义位图
在stdafx.h中#define OEMRESOURCE,并包含#include <windows>,参数一指定为 NULL
*/
hbmp = ::Loadbitmap(NULL,MAKEINTRESOURCE(OBM_CHECK));
//在static控件中加载位图
CStatic st;
st.SetBitmap(hbmp);
DeleteObject(hbmp);
3.加载PNG,JPG等非位图的自定义资源
主要是利用MFC的CImage类,
CImage加载图片有两种方法一是通过资源ID,二是通过资源路径直接load
方法一:通过资源ID,这种方法首先要找到资源句柄,加载到内存,并创建流对象,通过流对象在加载到CImage对象中
void LoadNBmpImg(CString strType,int nID,CImage* pImg)
{
if(pImg == NULL || strType.IsEmpty())
return;
//方法一:
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(nID), strType);
if(hrsrc)
{
HGLOBAL hglb = LoadResource(NULL, hrsrc);
LPVOID lpsz = LockResource(hglb);
ULARGE_INTEGER srcSize;
srcSize.QuadPart = SizeofResource(NULL, hrsrc);
IStream * pStream = NULL;
CreateStreamOnHGlobal(NULL, TRUE, &pStream);
if(pStream)
{
pStream->SetSize(srcSize);
DWORD cbWritten = 0;
pStream->Write(lpsz, srcSize.LowPart, &cbWritten);
//CImage logo;
VERIFY( pImg->Load(pStream) == S_OK );
pStream->Release();
}
}
//方法二:
// LPWSTR lpPath = new WCHAR[MAX_PATH];
// ::GetCurrentDirectory(MAX_PATH,lpPath);
// CString strTemp;
// strTemp.Format(_T("%s\\res\\company.png"),lpPath);
// CImage logo;
// logo.Load(strTemp);
// HBITMAP hBmp = logo.Detach();
// m_picDstEwm.SetBitmap(hBmp);
// //m_pic.SetWindowPos(NULL,0,0,723,256,SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);
// delete lpPath;
}
HRSRC FindResource(HMODULE hmodule,//包含程序资源的模块句柄,如果为程序本身,则指定为null
LPCTSTR lpname,//可以是资源名称或资源ID
LPCTSTR lpType );//自定义资源类型
返回值:指定的资源块句柄,共其他函数使用
功能:在指定的模块中定位指定的资源
---------------------------------------------------------
DWORD SizeofResource(HMODULE hmodule,//同上,指定的模块句柄
HRSRC hrsrc);//FindResource返回值
返回值:返回资源的字节数
----------------------------------------------------------
HGLOBAL LoadResource(HMODULE hmodule,//同上,指定的模块句柄
HRSRC hrsrc);//FindResource返回的指定资源句柄
返回值:指向资源的指针
-----------------------------------------------------------
LPVOID LockResource(HGLOBAL hResData);//参数:LoadResource返回值
返回值:也是指向资源内存的指针,LPVOID类型
LockResource的参数是LoadResource的返回值,据说LoadResource并未把资源加载到内存,只是一个无意义的句柄,而LockResource把它加载到内存并锁定,但是直接使用HGLOBAL也是没问题的,原理未知,小伙伴们可自行研究测试。
------------------------------------------------------------
得到指向资源内存的指针后就可以使用它的,示例代码中先创建一个流对象,把资源加载到流中,在把流对象加载到CImage对象中,在调用Detach分离出位图 HBITMAP hbmp = pImg->Detach();,也可以利用CImage对象在指定的DC上把资源绘制上去如:CDC *pDC = GetDC(); pImg->Draw(pDC->m_hDC,0,0);
---------------------------------------------------------------------------------------------------------------------------------
方法二:通过文件路径的方式
CImage logo; logo.Load(_T("C:\\tmp.png")); HBITMAP hBmp = logo.Detach();
之后可以利用CImage直接绘制到DC,或调用GDI+对象Graphics进行绘制
---------------------------------------------------------------------------------------------------------------------------------
参考:http://blog.csdn.net/zhongbin104/article/details/8730935