VC++中图像处理类CBitmap的用法
VC++中图像处理类CBitmap的用法
classCBitmap:publicCGdiObject
{
DECLARE_DYNAMIC(CBitmap)
public:
staticCBitmap*PASCALFromHandle(HBITMAPhBitmap);
//Constructors
CBitmap();
BOOLLoadBitmap(LPCTSTRlpszResourceName);
BOOLLoadBitmap(UINTnIDResource);
BOOLLoadOEMBitmap(UINTnIDBitmap);//forOBM_/OCR_/OIC_
#ifndef_AFX_NO_AFXCMN_SUPPORT
BOOLLoadMappedBitmap(UINTnIDBitmap,UINTnFlags=0,
LPCOLORMAPlpColorMap=NULL,intnMapSize=0);
#endif
BOOLCreateBitmap(intnWidth,intnHeight,UINTnPlanes,UINTnBitcount,
constvoid*lpBits);
BOOLCreateBitmapIndirect(LPBITMAPlpBitmap);
BOOLCreateCompatibleBitmap(CDC*pDC,intnWidth,intnHeight);
BOOLCreateDiscardableBitmap(CDC*pDC,intnWidth,intnHeight);
//Attributes
operatorHBITMAP()const;
intGetBitmap(BITMAP*pBitMap);
//Operations
DWORDSetBitmapBits(DWORDdwCount,constvoid*lpBits);
DWORDGetBitmapBits(DWORDdwCount,LPVOIDlpBits)const;
CSizeSetBitmapDimension(intnWidth,intnHeight);
CSizeGetBitmapDimension()const;
//Implementation
public:
virtual~CBitmap();
#ifdef_DEBUG
virtualvoidDump(CDumpContext&dc)const;
#endif
};
父
CGdiObject
classCGdiObject:publicCObject
{
DECLARE_DYNCREATE(CGdiObject)
public:
//Attributes
HGDIOBJm_hObject;//mustbefirstdatamember
operatorHGDIOBJ()const;
HGDIOBJGetSafeHandle()const;
staticCGdiObject*PASCALFromHandle(HGDIOBJhObject);
staticvoidPASCALDeleteTempMap();
BOOLAttach(HGDIOBJhObject);
HGDIOBJDetach();
//Constructors
CGdiObject();//mustCreateaderivedclassobject
BOOLDeleteObject();
//Operations
#pragmapush_macro("GetObject")
#undefGetObject
int_AFX_FUNCNAME(GetObject)(intnCount,LPVOIDlpObject)const;
intGetObject(intnCount,LPVOIDlpObject)const;
#pragmapop_macro("GetObject")
UINTGetObjectType()const;
BOOLCreateStockObject(intnIndex);
BOOLUnrealizeObject();
BOOLoperator==(constCGdiObject&obj)const;
BOOLoperator!=(constCGdiObject&obj)const;
//Implementation
public:
virtual~CGdiObject();
#ifdef_DEBUG
virtualvoidDump(CDumpContext&dc)const;
virtualvoidAssertValid()const;
#endif
};
1装载已导入工程的位图资源
//装载位图 CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP);
2装载位图文件
为了能让CBitmap能够装载位图文件,必须调用API函数LoadImage
HANDLELoadImage( HINSTANCEhinst,//handleoftheinstancecontainingtheimage LPCTSTRlpszName,//nameoridentifierofimage UINTuType,//typeofimage intcxDesired,//desiredwidth intcyDesired,//desiredheight UINTfuLoad//loadflags );
装载:Example1:
HBITMAPhBmp=(HBITMAP)LoadImage(NULL, m_fileName, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);
Example2:
HBITMAPhBmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), "BG.bmp", IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
将装载后得到的HBITMAP资源句柄与CBitmap对象相连
if(hBmp!=NULL){
CBitmap*pBmp=CBitmap::FromHandle(hBmp);
}
或
CBitmapbmp;
if(hBmp!=NULL){
bmp.DeleteObject();
bmp.Attach(hBmp);
}
3显示位图
CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAPbm; bmp.GetBitmap(&bm); CDCdc; 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);
4删除资源
CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP); CBitmap*pOld=pDC->SelectObject(&bmp); //此时位图对象还在pDC中,因此不能马上删除 //而是先将位图从DC中选出然后再删除 pDC->SelectObject(pOld); bmp.DeleteObject();
5CBitmap析构
当CBitmap作为局部变量在其退出作用范围后,会发生析构,这时候CBitmap会将其对应的位图资源(hBitmap)释放掉。
若想继续使用该位图资源hBitmap,则在退出作用范围前,应将位图资源hBitmap和CBitmap对象通过Detach()函数进行分离
HBITMAP CMyClass::Load()
{
CBitmapbmp;
bmp.LoadBitmap(IDB_BITMAP);
//通过Detach将资源与对象分离,这样bmp析构后,资源仍存在 //否则,bmp析构时,会将位图资源一起析构掉,这样出了局部范围外,就不可再使用这个位图资源了 returnbmp.Detach(); }