CBitmap类 总结

来源:互联网 发布:xp禁止运行内置软件 编辑:程序博客网 时间:2024/06/03 15:01


复制代码
class CBitmap : public CGdiObject{    DECLARE_DYNAMIC(CBitmap)public:    static CBitmap* PASCAL FromHandle(HBITMAP hBitmap);// Constructors    CBitmap();    BOOL LoadBitmap(LPCTSTR lpszResourceName);    BOOL LoadBitmap(UINT nIDResource);    BOOL LoadOEMBitmap(UINT nIDBitmap); // for OBM_/OCR_/OIC_#ifndef _AFX_NO_AFXCMN_SUPPORT    BOOL LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0,        LPCOLORMAP lpColorMap = NULL, int nMapSize = 0);#endif    BOOL 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);// Attributes    operator HBITMAP() const;    int GetBitmap(BITMAP* pBitMap);// Operations    DWORD 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 _DEBUG    virtual void Dump(CDumpContext& dc) const;#endif};
复制代码

CGdiObject
复制代码
class CGdiObject : public CObject{    DECLARE_DYNCREATE(CGdiObject)public:// Attributes    HGDIOBJ m_hObject;                  // must be first data member    operator HGDIOBJ() const;    HGDIOBJ GetSafeHandle() const;    static CGdiObject* PASCAL FromHandle(HGDIOBJ hObject);    static void PASCAL DeleteTempMap();    BOOL Attach(HGDIOBJ hObject);    HGDIOBJ Detach();// Constructors    CGdiObject(); // must Create a derived class object    BOOL DeleteObject();// Operations#pragma push_macro("GetObject")#undef GetObject    int _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 _DEBUG    virtual 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:

HBITMAP    hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),        "BG.bmp",        IMAGE_BITMAP,        0,0,        LR_LOADFROMFILE);

将装载后得到的HBITMAP资源句柄 与 CBitmap 对象 相连

if (hBmp != NULL) {        CBitmap *pBmp = CBitmap::FromHandle(hBmp);    }

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中,因此不能马上删除    // 而是先将位图从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;}
复制代码
转自:http://www.cnblogs.com/lujin49/p/4960999.html


0 0
原创粉丝点击