GDI 总结一 CBitmap类
来源:互联网 发布:里程记录软件 编辑:程序博客网 时间:2024/05/21 07:47
CBitmap类:
class CBitmap : public CGdiObject{DECLARE_DYNAMIC(CBitmap)public:static CBitmap* PASCAL FromHandle(HBITMAP hBitmap);// ConstructorsCBitmap();BOOL LoadBitmap(LPCTSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResource);BOOL LoadOEMBitmap(UINT nIDBitmap); // for OBM_/OCR_/OIC_#ifndef _AFX_NO_AFXCMN_SUPPORTBOOL LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0,LPCOLORMAP lpColorMap = NULL, int nMapSize = 0);#endifBOOL CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount,const void* lpBits);BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight);BOOL CreateDiscardableBitmap(CDC* pDC, int nWidth, int nHeight);// Attributesoperator HBITMAP() const;int GetBitmap(BITMAP* pBitMap);// OperationsDWORD SetBitmapBits(DWORD dwCount, const void* lpBits);DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const;CSize SetBitmapDimension(int nWidth, int nHeight);CSize GetBitmapDimension() const;// Implementationpublic:virtual ~CBitmap();#ifdef _DEBUGvirtual void Dump(CDumpContext& dc) const;#endif};
class CGdiObject : public CObject{DECLARE_DYNCREATE(CGdiObject)public:// AttributesHGDIOBJ m_hObject; // must be first data memberoperator HGDIOBJ() const;HGDIOBJ GetSafeHandle() const;static CGdiObject* PASCAL FromHandle(HGDIOBJ hObject);static void PASCAL DeleteTempMap();BOOL Attach(HGDIOBJ hObject);HGDIOBJ Detach();// ConstructorsCGdiObject(); // must Create a derived class objectBOOL DeleteObject();// Operations#pragma push_macro("GetObject")#undef GetObjectint _AFX_FUNCNAME(GetObject)(int nCount, LPVOID lpObject) const;int GetObject(int nCount, LPVOID lpObject) const;#pragma pop_macro("GetObject")UINT GetObjectType() const;BOOL CreateStockObject(int nIndex);BOOL UnrealizeObject();BOOL operator==(const CGdiObject& obj) const;BOOL operator!=(const CGdiObject& obj) const;// Implementationpublic:virtual ~CGdiObject();#ifdef _DEBUGvirtual void Dump(CDumpContext& dc) const;virtual void AssertValid() const;#endif};
1 装载已导入工程的位图资源
// 装载位图CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);
2 装载位图文件
为了能让CBitmap能够装载位图文件,必须调用API函数LoadImage
HANDLE LoadImage( HINSTANCE hinst, // handle of the instance containing the image LPCTSTR lpszName, // name or identifier of image UINT uType, // type of image int cxDesired, // desired width int cyDesired, // desired height UINT fuLoad // load flags);
装载:
Example 1:
HBITMAP hBmp = (HBITMAP)LoadImage(NULL,m_fileName,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
Example 2:
HBITMAPhBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
将装载后得到的HBITMAP资源句柄 与 CBitmap 对象 相连
if (hBmp != NULL) {CBitmap *pBmp = CBitmap::FromHandle(hBmp);}
OR
CBitmap bmp;if (hBmp != NULL) {bmp.DeleteObject();bmp.Attach(hBmp);}
3 显示位图
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);
4 删除资源
错误方式:
CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);CBitmap *pOld=pDC->SelectObject(&bmp);// 此时位图对象还在pDC中,因此不能删除 下面的语句是错误的bmp.DeleteObject();
正确方式:
CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);CBitmap *pOld=pDC->SelectObject(&bmp);// 此时位图对象还在pDC中,因此不能马上删除// 而是先将位图从DC中选出 然后再删除pDC->SelectObject(pOld);bmp.DeleteObject();
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;}
ON_MESSAGE(WM_PIC,OnPic)
(theApp.m_pMainWnd)->PostMessage(WM_PIC,(WPARAM)CopyHBitmap(hBitmap,IMG_HDC),0);
void OnPic(HBITMAP hBitmap)
- GDI 总结一 CBitmap类
- GDI 总结一 CBitmap类
- GDI 总结一 CBitmap类
- CBitmap类 总结
- gdi+ Bitmap 与CBitmap HBITMAP
- CBitmap类
- GDI+ 总结一: 保存图像文件
- GDI+ 总结一: 保存图像文件
- GDI+ 总结一: 保存图像文件
- 图形设备接口类,GDI类:CPen, CBrush,CFont,CBitmap,CRgn,CPalette等
- C++/MFC-GDI绘图之CBitmap位图
- 把GDI中的CBitmap转成GDI+中的Bitmap
- CBitmap位图类
- CBitmap
- CBitmap
- CBitmap转换成GDI+的Bitmap (Image)
- CBitmap转换成GDI+的Bitmap (Image)
- GDI(一)
- 拷贝构造函数和赋值函数
- java异常处理的使用。
- 输入两个整数n和m, 从数列1,2,...,n中任意选择几个数,使其和等于m, 要求编写程序输出所有的组合
- 流数据挖掘(三)
- 迷宫问题:hdoj1010 DFS--剪枝实现
- GDI 总结一 CBitmap类
- 需求入门: 原型开发
- Oracle经验集锦
- serial driver 1
- jQuery 动态操作表行
- web app
- 五种错误的实践方式导致软件开发项目难以管控
- UIView 效果
- 从容一生