VC编程之图像处理类CBitmap的用法

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);     
}

3. 显示位图

通过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函数将设备上下文还原到之前的状态。

4. 释放CBitmap资源

释放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对象。

5. CBitmap 析构

当CBitmap作为局部变量 在其退出作用范围后,会发生析构,这时候CBitmap会将其对应的位图资源(hBitmap )释放掉。若想继续使用该位图资源hBitmap,则在退出作用范围前,应将位图资源hBitmap和CBitmap对象通过Detach()函数进行分离 :

HBITMAP  CMyClass::Load()  
{  
    CBitmap bmp;  
    bmp.LoadBitmap(IDB_BITMAP);  
  
    // 通过Detach 将资源与对象分离,这样bmp析构后,资源仍存在    
    // 否则 ,bmp析构时,会将位图资源一起析构掉,这样出了局部范围外,就不可再使用这个位图资源了  
    return bmp.Detach();  
} 

6. 仅获得HBITMAP资源句柄情况下,获得这个资源的BITMAP信息

BITMAP bm;  
GetObject(hBitmap,sizeof(BITMAP),&bm); 

7. 在内存中开辟资源空间并将原图保存到内存中

//-------------------在内存中建立区域以存放所得位图-------------------  
// 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

<12>
发表评论0条 】
网友评论(共?条评论)..
VC编程之图像处理类CBitmap的用法