MFC中的位圖操作,涉及三個概念:CBitmap,HBitmap,BITMAP.
1.BITMAP是位圖的基本資料結構,封裝位圖資訊,包括顔色,大小,位值,資料等
<code>typedef</code> <code>struct</code> <code>tagBITMAP</code>
<code>{ </code>
<code> </code><code>int</code> <code>bmType;</code>
<code> </code><code>int</code> <code>bmWidth; </code><code>//寬</code>
<code> </code><code>int</code> <code>bmHeight; </code><code>//高</code>
<code> </code><code>int</code> <code>bmWidthBytes;</code>
<code> </code><code>BYTE</code> <code>bmPlanes;</code>
<code> </code><code>BYTE</code> <code>bmBitsPixel;</code>
<code> </code><code>LPVOID</code> <code>bmBits;</code>
<code>} BITMAP;</code>
2.HBitmap是位圖句柄,可以通過API函數LoadImage加載檔案得到,LoadImage得到的句柄為通用類型即,HANDLE.需要轉換成具體的資源類型後,才能給繪圖CDC類執行個體使用,如:
<code>HBITMAP</code> <code>hBitmap = (</code><code>HBITMAP</code><code>)::LoadImage(NULL, </code>
<code> </code><code>_T(</code><code>"1.bmp"</code><code>), </code>
<code> </code><code>IMAGE_BITMAP, </code>
<code> </code><code>0, 0, </code><code>//原始大小</code>
<code> </code><code>LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE);</code>
<code>//或者另外一個API函數,此函數僅從資源中加載位圖</code>
<code>HBITMAP</code> <code>hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,</code>
<code>MAKETRESOURCE(IDB_BITMAP1);</code>
3.CBitmap是對BITMAP實作類的封裝.
CBitmap有兩個重載的成員函數:
BOOL LoadBitmap( LPCTSTR lpszResourceName ); //從檔案加載位圖
BOOL LoadBitmap( UINT nIDResource ); //從資源加載位圖
調用方法如下:
<code>CBitmap m_bitmap;</code>
<code>m_bitmap.LoadBitmap(_T(</code><code>"1.bmp"</code><code>));</code><code>//從檔案加載</code>
三者之間的轉換關系:
<code>HBITMAP</code> <code>hBitmap;</code>
<code>CBitmap m_bitmap;</code>
<code>BITMAP bm;</code>
<code>//下面是三者之間的聯系:</code>
<code>m_bitmap.Attach(hBitmap);</code><code>//HBITMAP句柄關聯到CBitmap</code>
<code>hBitmap=(</code><code>HBITMAP</code><code>)m_bitmap.GetSafeHandle();</code><code>//由CBitmap得到相關的HBITMAP句柄</code>
<code>m_bitmap.GetBitmap(&bm); </code><code>//由CBitmap得到相應的BITMAP資訊</code>
要顯示位圖,這三者都會用到。但無論是HBITMAP還是CBitmap還是BITMAP,都不能直接顯示其對應的位圖,需要借助一個記憶體DC,來完成畫圖,并将這個繪圖後的DC複制到視窗DC中,才能顯示。如下:
<code>CClientDC dc(</code><code>this</code><code>);</code><code>//若在OnPaint處理函數中,可用CPaintDC</code>
<code>CBitmap m_Bitmap;</code><code>//位圖類加載</code>
<code>//m_Bitmap.LoadBitmap(_T("1.bmp"));這個函數加載位圖檔案無效,隻能加載資源ID</code>
<code>//要加載位圖檔案,可用LoadImage函數,如下</code>
<code>HBITMAP</code> <code>hBitmap = (</code><code>HBITMAP</code><code>)LoadImage(AfxGetInstanceHandle(),</code>
<code> </code><code>_T(</code><code>"1.bmp"</code><code>), IMAGE_BITMAP, 0, 0, 0x10);</code>
<code>m_Bitmap.Attach(hBitmap);</code><code>//将位圖對象與位圖資源關聯</code>
<code>//①如果不想加載位圖,隻想在記憶體中繪圖,可以如下:</code>
<code>//m_Bitmap.CreateCompatibleBitmap(&dc,800,103);//建立DC相容的位圖,須指定大小</code>
<code>CDC MemDC;</code><code>//借助記憶體DC來顯示位圖 </code>
<code>MemDC.CreateCompatibleDC(NULL);</code><code>//建立記憶體DC </code>
<code>//将記憶體DC和位圖關聯,才能在記憶體中畫圖</code>
<code>CBitmap *pOldBmp = MemDC.SelectObject(&m_Bitmap);</code>
<code>BITMAP BM; </code><code>//位圖資訊</code>
<code>m_Bitmap.GetObject(</code><code>sizeof</code><code>(BM), &BM);</code>
<code>//複制到視窗DC中</code>
<code>dc.BitBlt(0, 0, </code><code>//目标裝置邏輯橫、縱坐标 </code>
<code> </code><code>BM.bmWidth, BM.bmHeight, </code><code>//顯示位圖的像素寬、高度 </code>
<code> </code><code>&MemDC, </code><code>//待顯示位圖資料的裝置情境對象 </code>
<code> </code><code>0, 0, </code><code>//源資料中的橫、縱坐标</code>
<code> </code><code>SRCCOPY); </code><code>//位操作方式</code>
<code>MemDC.SelectObject(pOldBmp);</code><code>//注意這一句,否則加載的位圖不能釋放,即資源洩漏</code>
<code>//m_Bitmap.DeleteObject();//有的網上資料說需要以下兩句,經過測試,不需要,</code>
<code>//MemDC.DeleteDC(); //類在析構時會自動調用</code>
上面這個過程,也就是常說的雙緩沖繪圖.如果不想顯示位圖,可以建立一個空白的記憶體DC,然後在其上繪圖.(見①處注釋的代碼)
本文轉自Chinayu201451CTO部落格,原文連結:http://blog.51cto.com/9233403/1974474 ,如需轉載請自行聯系原作者