2014-08-10 09:18:37|?次阅读|上传:huigezrx【已有?条评论】发表评论
关键词:C/C++, 图形/图像, MFC|来源:唯设编程网
方案2:
HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), "BG.bmp", IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
通常,在装载后还需要将装载后得到的HBITMAP资源句柄与CBitmap对象关联:
方案1:
if (hBmp != NULL) { CBitmap *pBmp = CBitmap::FromHandle(hBmp); }
方案2:
CBitmap bmp; if (hBmp != NULL) { bmp.DeleteObject(); bmp.Attach(hBmp); }
通过CBitmap的成员函数LoadBitmap加载位图以后,我们可以通过如下方式将其显示在环境中:
CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAP bm; bmp.GetBitmap(&bm); CDC dc; dc.CreateCompatibleDC(pDC); CBitmap*pOldBmp=(CBitmap *)dc.SelectObject(&bmp); pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY); pDC->SelectObject(pOldBmp); bmp.DeleteObject(); bmp.LoadBitmap(IDB_BITMAP2);
显示位图我们通过HDC的BitBlt函数实现,HDC通过CDC的CreateCompatibleDC得到。需要注意的是,在绘制位图完成以后,我们通常需要使用HDC的SelectObject函数将设备上下文还原到之前的状态。
释放CBitmap资源应该使用如下方式:
CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP); CBitmap *pOld=pDC->SelectObject(&bmp); // 此时位图对象还在pDC中,因此不能马上删除 // 而是先将位图从DC中选出 然后再删除 pDC->SelectObject(pOld); bmp.DeleteObject();
通常容易使用如下错误的方式释放CBitmap资源:
CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP); CBitmap *pOld=pDC->SelectObject(&bmp); // 此时位图对象还在pDC中,因此不能删除 下面的语句是错误的 bmp.DeleteObject();
注意:不能释放还在设备上下文中的CBitmap对象。
当CBitmap作为局部变量 在其退出作用范围后,会发生析构,这时候CBitmap会将其对应的位图资源(hBitmap )释放掉。若想继续使用该位图资源hBitmap,则在退出作用范围前,应将位图资源hBitmap和CBitmap对象通过Detach()函数进行分离 :
HBITMAP CMyClass::Load() { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP); // 通过Detach 将资源与对象分离,这样bmp析构后,资源仍存在 // 否则 ,bmp析构时,会将位图资源一起析构掉,这样出了局部范围外,就不可再使用这个位图资源了 return bmp.Detach(); }
BITMAP bm; GetObject(hBitmap,sizeof(BITMAP),&bm);
//-------------------在内存中建立区域以存放所得位图------------------- // hBitmapSrc 为 CBitmap中保存的矩形原图资源句柄 // hDC 句柄 // 在内存中开辟位图资源,用以保存原图 HBITMAP CopyHBitmap(HBITMAP hBitmapSrc,HDC hDC) { BITMAP bm; HBITMAP hBitmapDst; HDC hdcSrc,hdcDst; GetObject(hBitmapSrc,sizeof(BITMAP),&bm); hBitmapDst=CreateCompatibleBitmap(hDC,bm.bmWidth,bm.bmHeight); hdcSrc=CreateCompatibleDC(hDC); hdcDst=CreateCompatibleDC(hDC); SelectObject(hdcSrc,hBitmapSrc); SelectObject(hdcDst,hBitmapDst); BitBlt(hdcDst,0,0,bm.bmWidth,bm.bmHeight,hdcSrc,0,0,SRCCOPY); DeleteDC(hdcSrc); DeleteDC(hdcDst); return hBitmapDst; }
到此,位图处理类CBitmap就介绍完了,欢迎各位继续补充。
本文参考:http://blog.csdn.net/shuilan0066/article/details/7079973