TransparentBlt函數的使用注意事項


  今天客戶需要在軟件上需要添加一個自己公司的Logo,要求使用鏤空透明的形式展現,本來以為很簡單的工作沒想到在MFC下這么復雜。
Logo為BMP格式,白色背景。

  以為和在按鈕上顯示控件差不多,先導入BITMAP資源,比如叫IDB_BITMAP1,按鈕名比如叫IDC_BUTTON1,
按鈕上貼圖的代碼:
CBitmap m_bmp;
m_bmp.LoadBitmap(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)m_bmp.GetSafeHandle();
((CButton*)GetDlgItem(IDC_BUTTON1))->SetBitmap(hBitmap);

  本來以為和Delphi里面的按鈕一樣,設置熟悉為Transparent以后會自動根據BMP圖片左上角的像素顏色作為透明色,結果是讓人失望的。
這個屬性只有在顯示文字時有用。

  無奈只好派生CStatic類重載OnPaint函數,在函數里使用TransparentBlt將白色設置為透明色。

代碼大致如下:

CPaintDC dc(this);
CDC memDc;
memDc.CreateCompatibleDC(&dc);
BITMAP bm;
m_bitmap.GetBitmap(&bm);
memDc.SelectObject(&m_bitmap);
dc.TransparentBlt(10, 10, bm.bmWidth, bm.bmHeight, &memDc, 0, 0, bm.bmWidth, bm.bmHeight, RGB(255, 255, 255));

  修改完成后運行程序,居然顯示不出圖像,怎么回事?改為BitBlt測試一切正常。經過調試后發現原來是TransparentBlt參數的問題。
原來TransparentBlt的倒數第2,3個參數必須小於圖片實際大小,這個行為和BitBlt不同,需要格外注意。修改完成后,運行達到要求。

  忘了還有,#pragma comment( lib, "msimg32.lib" )TransparentBlt函數需要加載這個類庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM