blt功能_BitBlt实现TransparentBlt
文章用BitBlt實現了TransparentBlt的功能,主要的工作如下:
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);// 創建單色掩碼位圖
HDChImageDC = CreateCompatibleDC(hdcDest);
HDChMaskDC = 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);
// 設置透明色
// 多色向單色繪制時,把多色圖的背景色轉換為白色,其他的轉換為黑色。
// 設置crTransparent為背景色,轉換時成單色圖時,把藍色都轉為白色,其余為黑色。
SetBkColor(hImageDC, crTransparent);
// 生成透明區域為白色,其它區域為黑色的掩碼位圖
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明區域為黑色,其它區域保持不變的位圖
// 此時,hMaskDC中,白色為底色,黑色為前景色。
SetBkColor(hImageDC, RGB(0,0,0));//彩色位圖的背景色被指定為黑色;
SetTextColor(hImageDC, RGB(255,255,255));//彩色位圖的前景色被指定為白色,
//如果此彩色位圖轉換為單色,那么黑色變為單色位圖的背景色,其他變為前景色。
//而單色位圖的背景色一定是白色的,前景是黑色,也就是多色的黑->白。其他變黑。
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);//將單色圖繪制到這個DC上,
//背景色是黑色,前景色是白色,即單色位圖向這個DC上繪制,前景色要變為白色,背景色變為黑色,
//再求與,就得到背景色為黑色(0 & n = 0),前景色不變(1 & n = n)的位圖。
// 透明部分保持屏幕不變,其它部分變成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);//同上,
//單色圖向這個DC繪制,前景色為黑色,背景色為白色,則產生前景色為黑色,背景色不變的位圖。
// "或"運算,生成最終效果。
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
在這個函數開始之前,假設背景圖已經選入hdcDest中。
總結
以上是生活随笔為你收集整理的blt功能_BitBlt实现TransparentBlt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (linux was重启)
- 下一篇: openlayers地图旋转_地图切换动