日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

blt功能_BitBlt实现TransparentBlt

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。