圖片透明函數的實現MyTransparentBlt


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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章