天天看點

MFC中的位圖操作

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()-&gt;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(&amp;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(&amp;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(&amp;m_Bitmap);</code>

<code>BITMAP BM;        </code><code>//位圖資訊</code>

<code>m_Bitmap.GetObject(</code><code>sizeof</code><code>(BM), &amp;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>&amp;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 ,如需轉載請自行聯系原作者

繼續閱讀