GDI 總結一 CBitmap類

CBitmap類:

 

  1. class CBitmap : public CGdiObject  
  2. {  
  3.     DECLARE_DYNAMIC(CBitmap)  
  4.   
  5. public:  
  6.     static CBitmap* PASCAL FromHandle(HBITMAP hBitmap);  
  7.   
  8. // Constructors  
  9.     CBitmap();  
  10.   
  11.     BOOL LoadBitmap(LPCTSTR lpszResourceName);  
  12.     BOOL LoadBitmap(UINT nIDResource);  
  13.     BOOL LoadOEMBitmap(UINT nIDBitmap); // for OBM_/OCR_/OIC_  
  14. #ifndef _AFX_NO_AFXCMN_SUPPORT  
  15.     BOOL LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0,  
  16.         LPCOLORMAP lpColorMap = NULL, int nMapSize = 0);  
  17. #endif  
  18.     BOOL CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount,  
  19.             const void* lpBits);  
  20.     BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);  
  21.     BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight);  
  22.     BOOL CreateDiscardableBitmap(CDC* pDC, int nWidth, int nHeight);  
  23.   
  24. // Attributes  
  25.     operator HBITMAP() const;  
  26.     int GetBitmap(BITMAP* pBitMap);  
  27.   
  28. // Operations  
  29.     DWORD SetBitmapBits(DWORD dwCount, const void* lpBits);  
  30.     DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const;  
  31.     CSize SetBitmapDimension(int nWidth, int nHeight);  
  32.     CSize GetBitmapDimension() const;  
  33.   
  34. // Implementation  
  35. public:  
  36.     virtual ~CBitmap();  
  37. #ifdef _DEBUG  
  38.     virtual void Dump(CDumpContext& dc) const;  
  39. #endif  
  40. };  


 

  1. class CGdiObject : public CObject  
  2. {  
  3.     DECLARE_DYNCREATE(CGdiObject)  
  4. public:  
  5.   
  6. // Attributes  
  7.     HGDIOBJ m_hObject;                  // must be first data member  
  8.     operator HGDIOBJ() const;  
  9.     HGDIOBJ GetSafeHandle() const;  
  10.   
  11.     static CGdiObject* PASCAL FromHandle(HGDIOBJ hObject);  
  12.     static void PASCAL DeleteTempMap();  
  13.     BOOL Attach(HGDIOBJ hObject);  
  14.     HGDIOBJ Detach();  
  15.   
  16. // Constructors  
  17.     CGdiObject(); // must Create a derived class object  
  18.     BOOL DeleteObject();  
  19.   
  20. // Operations  
  21. #pragma push_macro("GetObject")  
  22. #undef GetObject  
  23.     int _AFX_FUNCNAME(GetObject)(int nCount, LPVOID lpObject) const;  
  24.     int GetObject(int nCount, LPVOID lpObject) const;  
  25. #pragma pop_macro("GetObject")  
  26.     UINT GetObjectType() const;  
  27.     BOOL CreateStockObject(int nIndex);  
  28.     BOOL UnrealizeObject();  
  29.     BOOL operator==(const CGdiObject& obj) const;  
  30.     BOOL operator!=(const CGdiObject& obj) const;  
  31.   
  32. // Implementation  
  33. public:  
  34.     virtual ~CGdiObject();  
  35. #ifdef _DEBUG  
  36.     virtual void Dump(CDumpContext& dc) const;  
  37.     virtual void AssertValid() const;  
  38. #endif  
  39. };  

 

 


 

1 裝載已導入工程的位圖資源

 

  1. // 裝載位圖  
  2.   
  3. CBitmap bmp;  
  4. bmp.LoadBitmap(IDB_BITMAP);  


 

2 裝載位圖文件

    爲了能讓CBitmap能夠裝載位圖文件,必須調用API函數LoadImage

 

  1. HANDLE LoadImage(  
  2.   HINSTANCE hinst,   // handle of the instance containing the image  
  3.   LPCTSTR lpszName,  // name or identifier of image  
  4.   UINT uType,        // type of image  
  5.   int cxDesired,     // desired width  
  6.   int cyDesired,     // desired height  
  7.   UINT fuLoad        // load flags  
  8. );  

 

裝載:

 Example 1:

  1. HBITMAP hBmp = (HBITMAP)LoadImage(NULL,  
  2.     m_fileName,  
  3.     IMAGE_BITMAP,   
  4.     0, 0,   
  5.     LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);  

 

Example 2:

  1.   HBITMAP   hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),  
  2. "BG.bmp",  
  3. IMAGE_BITMAP,  
  4. 0,0,  
  5. LR_LOADFROMFILE);  


將裝載後得到的HBITMAP資源句柄 與 CBitmap 對象 相連

 

  1. if (hBmp != NULL) {  
  2.     CBitmap *pBmp = CBitmap::FromHandle(hBmp);  
  3. }  


     OR

  1. CBitmap bmp;  
  2. if (hBmp != NULL) {  
  3.     bmp.DeleteObject();  
  4.     bmp.Attach(hBmp);     
  5. }  


 

3 顯示位圖

 

 

  1. CBitmap bmp;  
  2. bmp.LoadBitmap(IDB_BITMAP1);  
  3.   
  4. BITMAP bm;  
  5. bmp.GetBitmap(&bm);  
  6.   
  7. CDC dc;  
  8. dc.CreateCompatibleDC(pDC);  
  9. CBitmap*pOldBmp=(CBitmap *)dc.SelectObject(&bmp);  
  10.   
  11. pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY);  
  12. pDC->SelectObject(pOldBmp);  
  13.   
  14. bmp.DeleteObject();  
  15. bmp.LoadBitmap(IDB_BITMAP2);  


4 刪除資源

 

錯誤方式:

  1. CBitmap bmp;  
  2. bmp.LoadBitmap(IDB_BITMAP);  
  3.   
  4. CBitmap *pOld=pDC->SelectObject(&bmp);  
  5.   
  6. // 此時位圖對象還在pDC中,因此不能刪除  下面的語句是錯誤的  
  7. bmp.DeleteObject();  


 

正確方式:

  1. CBitmap bmp;  
  2. bmp.LoadBitmap(IDB_BITMAP);  
  3.   
  4. CBitmap *pOld=pDC->SelectObject(&bmp);  
  5.   
  6. // 此時位圖對象還在pDC中,因此不能馬上刪除  
  7. // 而是先將位圖從DC中選出 然後再刪除  
  8. pDC->SelectObject(pOld);  
  9. bmp.DeleteObject();  


 

5 CBitmap 析構

 

當CBitmap作爲局部變量 在其退出作用範圍後,會發生析構,這時候CBitmap會將其對應的位圖資源(hBitmap )釋放掉。

若想繼續使用該位圖資源hBitmap,則在退出作用範圍前,應將位圖資源hBitmap和CBitmap對象通過Detach()函數進行分離 

 

  1. HBITMAP  CMyClass::Load()  
  2. {  
  3.     CBitmap bmp;  
  4.     bmp.LoadBitmap(IDB_BITMAP);  
  5.   
  6.     // 通過Detach 將資源與對象分離,這樣bmp析構後,資源仍存在    
  7.     // 否則 ,bmp析構時,會將位圖資源一起析構掉,這樣出了局部範圍外,就不可再使用這個位圖資源了  
  8.     return bmp.Detach();  
  9. }  


 

6 在僅獲得HBITMAP資源句柄情況下,如何獲得這個資源的BITMAP信息

 

  1. BITMAP bm;  
  2. GetObject(hBitmap,sizeof(BITMAP),&bm);  


 

 7 在內存中開闢資源空間 將原圖保存到內存中

 

  1. //-------------------在內存中建立區域以存放所得位圖-------------------  
  2. // hBitmapSrc 爲 CBitmap中保存的矩形原圖資源句柄  
  3. // hDC 句柄     
  4. // 在內存中開闢位圖資源,用以保存原圖  
  5. HBITMAP CopyHBitmap(HBITMAP hBitmapSrc,HDC hDC)  
  6. {  
  7.       
  8.     BITMAP bm;  
  9.     HBITMAP hBitmapDst;  
  10.     HDC hdcSrc,hdcDst;  
  11.   
  12.     GetObject(hBitmapSrc,sizeof(BITMAP),&bm);  
  13.     hBitmapDst=CreateCompatibleBitmap(hDC,bm.bmWidth,bm.bmHeight);  
  14.   
  15.     hdcSrc=CreateCompatibleDC(hDC);  
  16.     hdcDst=CreateCompatibleDC(hDC);  
  17.   
  18.     SelectObject(hdcSrc,hBitmapSrc);   
  19.     SelectObject(hdcDst,hBitmapDst);  
  20.   
  21.     BitBlt(hdcDst,0,0,bm.bmWidth,bm.bmHeight,hdcSrc,0,0,SRCCOPY);  
  22.       
  23.     DeleteDC(hdcSrc);  
  24.     DeleteDC(hdcDst);     
  25.     return hBitmapDst;  
  26.   
  27. }  


 

  1. ON_MESSAGE(WM_PIC,OnPic)  

 

  1. (theApp.m_pMainWnd)->PostMessage(WM_PIC,(WPARAM)CopyHBitmap(hBitmap,IMG_HDC),0);  

 

  1. void OnPic(HBITMAP hBitmap)  


 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章