GDI 总结一 CBitmap类

52 篇文章 1 订阅

CBitmap类:

  1. 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;                                        
                                                                                 
    // Implementation                                                            
    public:                                                                      
        virtual ~CBitmap();                                                      
    #ifdef _DEBUG                                                                
        virtual void Dump(CDumpContext& dc) const;                               
    #endif                                                                       
    };                                                                           
    
  1. 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;                      
                                                                           
    
     


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


     

    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) 


     

     

    http://blog.csdn.net/shuilan0066/article/details/7079973

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值