加载图片的方式

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值