1.要有一個目標DC,源位圖,屏蔽色
2.生成一個單色位圖作為一個屏蔽位圖.
指定源位圖的背景色設為屏蔽色.(背景色在繪制是不會畫出來的)
將源位圖畫到屏蔽位圖上這樣形成了一幅背景為白色前景為黑色的屏蔽位圖.
其中的白色部分就是源位圖的屏蔽色部分,黑色部分是源位圖中打算要顯示的部分.
3.將源位圖的前景色設為黑色,背景色設為白色.(這樣源位圖才能完整的顯示出來)
將源位圖用异或的方式畫到目表設備上.
將目標設備的背景色設為白色.(這樣屏蔽位圖的背景色白色才能顯示出來)
將屏蔽位圖用AND的方式畫在剛才源位圖所繪區域.
再將源位圖用异或的方式畫到目表設備上.
到此透明位圖就顯示出來了.例如:
CBitmap srcBMP;
BITMAP bmpInfo;
HBITMAP hbmp;
COLORREF mskColor;
//步驟1
//加載源位圖
if(hbmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"1.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE))
srcBMP.Attach(hbmp);
else
AfxMessageBox("Con't Load the Bmp");
srcBMP.GetBitmap(&bmpInfo);
CPaintDC dstDC(this); //目標DC
CDC srcDC; //源DC
CDC mskDC; //屏蔽DC
srcDC.CreateCompatibleDC(NULL);
mskDC.CreateCompatibleDC(NULL);
CBitmap mskBmp;
//步驟2
//創建單色位圖
mskBmp.CreateBitmap(bmpInfo.bmWidth,bmpInfo.bmHeight,0,1,NULL);
srcDC.SelectObject(srcBMP);
//設制屏蔽色
srcDC.SetBkColor(mskColor);
mskDC.SelectObject(mskBmp);
//繪制屏蔽位圖
mskDC.BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&srcDC,0,0,SRCCOPY);
srcDC.SetBkColor(RGB(255,255,255));
srcDC.SetTextColor(RGB(0,0,0));
//源位圖用异或的方式畫到目表設備
dstDC.BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&srcDC,0,0,SRCINVERT);
//屏蔽位圖用AND的方式畫到目表設備
dstDC.SetBkColor(RGB(255,255,255));
dstDC.BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&mskDC,0,0,SRCAND);
//源位圖用异或的方式畫到目表設備
dstDC.BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,&srcDC,0,0,SRCINVERT);
//肆放資源
srcDC.DeleteDC();
mskDC.DeleteDC();
ReleaseDC(&srcDC);
ReleaseDC(&mskDC);