bool MyTransparentBlt(HDC backDC,int x1,int y1,int w1,int h1,HDC foreDC,int x2,int y2,int w2,int h2,UINT TransColor)
{
HDC maskDC = CreateCompatibleDC(0); // '1.建立单色mask DC
HBITMAP maskBitmap = CreateBitmap(w2, h2, 1, 1, 0);//建立与前景图大小相同的HBITMAP
SelectObject( maskDC, maskBitmap);//maskBitmap选入maskDC
SetBkColor( foreDC, TransColor); //'2.把前景图的背景色设为透明色
BitBlt (maskDC, x1, y1, w1, h1, foreDC, x2, y2, SRCCOPY); //'3.copy前景图到单色DC得到mask
SetBkColor( foreDC, RGB(0, 0, 0));// '4.把前景图与mask图作与运算
SetTextColor (foreDC, RGB(255, 255, 255));//设置前景图前景颜色为全1
BitBlt (foreDC, x1, y1, w1, h1, maskDC, x2, y2, SRCAND);
SetBkColor( backDC, RGB(255, 255, 255) );// '5.把背景图与mask图作与运算
SetTextColor (backDC, RGB(0, 0, 0));//设置背景图前景颜色为全0
BitBlt( backDC, x1, y1, w1, h1, maskDC, x2, y2, SRCAND);
//'6.把前景图和背景图作或运算
BitBlt( backDC,x1, y1, w1, h1, foreDC, x2, y2, SRCPAINT);
SelectObject(maskDC, maskBitmap);
DeleteDC(maskDC);
DeleteObject(maskBitmap);
return true;
}
bool MyTransparentBlt2(HDC backDC,int x1,int y1,int w1,int h1,HDC foreDC,int x2,int y2,int w2,int h2,UINT TransColor)
{
HDC maskDC = CreateCompatibleDC(0); // '1.建立单色mask DC
HBITMAP maskBitmap = CreateBitmap(w2, h2, 1, 1, 0);//建立与前景图大小相同的HBITMAP
SelectObject( maskDC, maskBitmap);//maskBitmap选入maskDC
SetBkColor( foreDC, TransColor); //'2.把前景图的背景色设为透明色
//StretchBlt (maskDC, x1, y1, w1, h1, foreDC, x2, y2, w2,h2,SRCCOPY); //'3.copy前景图到单色DC得到mask
if (w1==w2&&h1==h2)
BitBlt(maskDC, x1, y1, w1, h1, foreDC, w2,h2,SRCCOPY);
else
StretchBlt(maskDC, x1, y1, w1, h1, foreDC, x2, y2, w2,h2,SRCCOPY);
SetBkColor( foreDC, RGB(0, 0, 0));// '4.把前景图与mask图作与运算
SetTextColor (foreDC, RGB(255, 255, 255));//设置前景图前景颜色为全1
BitBlt (foreDC, x1, y1, w1, h1, maskDC, w2,h2,SRCAND);
SetBkColor( backDC, RGB(255, 255, 255) );// '5.把背景图与mask图作与运算
SetTextColor (backDC, RGB(0, 0, 0));//设置背景图前景颜色为全0
BitBlt ( backDC, x1, y1, w1, h1, maskDC, w2,h2,SRCAND);
//'6.把前景图和背景图作或运算
BitBlt ( backDC,x1, y1, w1, h1, foreDC, w2,h2, SRCPAINT);
SelectObject(maskDC, maskBitmap);
DeleteDC(maskDC);
DeleteObject(maskBitmap);
return true;
}
BOOL CMFCtestDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnEraseBkgnd(pDC);
CDC cdc;
cdc.CreateCompatibleDC(pDC);
cdc.SelectObject(&cbmp1);
BITMAP bmp;
cbmp2.GetBitmap(&bmp);
CRect rect;
GetClientRect(&rect);
MyTransparentBlt2(pDC->m_hDC,0,0,bmp.bmWidth,bmp.bmHeight,
cdc.m_hDC,0,0,bmp.bmWidth,bmp.bmHeight,GetPixel(cdc.m_hDC,46,46));
cdc.DeleteDC();
return true;
//return CDialog::OnEraseBkgnd(pDC);
}