在EVC或VC8.0中,有關圖片處理的資料并不多,SDK中的例子只是告訴你如何加載圖片,下面的代碼可以用在VC的任何編譯器上,它的原理是采用的雙緩沖技術,用為運算來完成此項功能。
void TransparentBlt2( HDC hdcDest, // 目標DC
int nXOriginDest, // 目標X偏移
int nYOriginDest, // 目標Y偏移
int nWidthDest, // 目標寬度
int nHeightDest, // 目標高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起點
int nYOriginSrc, // 源Y起點
int nWidthSrc, // 源寬度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF類型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 創建兼容位圖
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 創建單色掩碼位圖
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
// 將源DC中的位圖拷貝到臨時DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 設置透明色
SetBkColor(hImageDC, crTransparent);
// 生成透明區域為白色,其它區域為黑色的掩碼位圖
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明區域為黑色,其它區域保持不變的位圖
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// 透明部分保持屏幕不變,其它部分變成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// "或"運算,生成最終效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
這個函數的調用一般在WM_PAINT消息處理函數,在WIN32工程中,可參照下面的代碼來做:
RECT rc;
GetClientRect(hwnd,&rc);
HDC dc = GetDC(hwnd);//客戶區的HDC
void LoadImg(HDC dc,LPCTSTR FilePath)//HDC是客戶區的HDC,FilePath是文件路徑,
{
COLORREF crMask = RGB(255,0,255);
HBITMAP m_hSrcBmp = SHLoadDIBitmap(FilePath);/此函數僅限于WM5.0等PPC,
BITMAPINFO BitInfo;
GetObject(m_hSrcBmp, sizeof(BITMAPINFO), &BitInfo);
int nWidth = BitInfo.bmiHeader.biWidth;
int nHeight = BitInfo.bmiHeader.biHeight;
HDC ImageDC = CreateCompatibleDC(dc);
HBITMAP pOldImageBMP = NULL;
HDC OldDC = CreateCompatibleDC(dc);
SelectObject(ImageDC,pOldImageBMP);
SelectObject(ImageDC,m_hSrcBmp);
TransparentBlt2(dc,24,0,nWidth,nHeight,ImageDC,0,0,nWidth,nHeight,crMask);
SelectObject(ImageDC,pOldImageBMP);
}
MFC的工程的調用相對簡單,在OnPaint中調用
{
CRect rect;
::GetWindowRect (GetDlgItem(IDC_COMBO1)->m_hWnd, rect);
ScreenToClient (rect);
//加載位圖
CBitmap m_bitmap;//注意這個變量不能是全局變量或類的成員變量,否則不能更新
wchar_t FilePath1[128] = {0};
m_bitmap.Attach(SHLoadImageFile(FilePath));
COLORREF crMask = RGB(255,0,255);//要過濾顏色的RGB的值
BITMAP bm;
m_bitmap.GetBitmap(&bm);
int nWidth1 = bm.bmWidth;
int nHeight1 = bm.bmHeight;
CDC ImageDC;
ImageDC.CreateCompatibleDC(&dc);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&m_bitmap);
TransparentBlt2(dc.m_hDC,0,rect.bottom,nWidth1,nHeight1,ImageDC.m_hDC,0,0,nWidth1,nHeight1,crMask);
ImageDC.SelectObject(pOldImageBMP);
}