//代码如下,有些绘制出来是透明和,有的则不透明
//跟踪发现对于有些位图不能得到正确的掩码void DrawTransparentBmp(CDC *destDC, CBitmap *bmp, int x, int y, int w, int h)
{
if((destDC)&&(bmp)&&(bmp->m_hObject))
{
CRect rc;
destDC->GetClipBox(&rc);
if(w == 0)
w = rc.Width();
if(h == 0)
h = rc.Height();
//设定暂存DC
CDC mdc;
mdc.CreateCompatibleDC(destDC);
CBitmap tbmp;
tbmp.CreateCompatibleBitmap(destDC,w,h);
CBitmap* oldtbmp = mdc.SelectObject(&tbmp);
mdc.BitBlt(0,0,w,h,destDC,x,y,SRCCOPY); //原图
CDC dc0;
dc0.CreateCompatibleDC(destDC);
CBitmap* olddc0 = dc0.SelectObject(bmp);
COLORREF cr = dc0.GetPixel(0,0);//背景
COLORREF cr1 = dc0.SetBkColor(cr); //为什么不正确,有时不能得到正确的掩码
CDC maskdc;
maskdc.CreateCompatibleDC(destDC);
CBitmap maskbmp;
maskbmp.CreateBitmap(w,h,1,1,0);
CBitmap* oldmask = maskdc.SelectObject(&maskbmp);
maskdc.FillSolidRect(0,0,w,h,0x00ffffff);
maskdc.BitBlt(0,0,w,h,&dc0,0,0,SRCCOPY);
// dc0.SetBkColor(cr1); dc0.BitBlt(0,0,w,h,&maskdc,0,0,SRCINVERT);//原图边上变为黑色
mdc.BitBlt(0,0,w,h,&maskdc,0,0,SRCAND);//背景内部变为黑色
mdc.BitBlt(0,0,w,h,&dc0,0,0,SRCPAINT);//合并 destDC->SetBkColor(0x00ffffff);
destDC->BitBlt(x,y,w,h,&mdc,0,0,SRCCOPY);
maskdc.SelectObject(oldmask);
dc0.SelectObject(olddc0);
mdc.SelectObject(oldtbmp);
tbmp.DeleteObject();
}
//跟踪发现对于有些位图不能得到正确的掩码void DrawTransparentBmp(CDC *destDC, CBitmap *bmp, int x, int y, int w, int h)
{
if((destDC)&&(bmp)&&(bmp->m_hObject))
{
CRect rc;
destDC->GetClipBox(&rc);
if(w == 0)
w = rc.Width();
if(h == 0)
h = rc.Height();
//设定暂存DC
CDC mdc;
mdc.CreateCompatibleDC(destDC);
CBitmap tbmp;
tbmp.CreateCompatibleBitmap(destDC,w,h);
CBitmap* oldtbmp = mdc.SelectObject(&tbmp);
mdc.BitBlt(0,0,w,h,destDC,x,y,SRCCOPY); //原图
CDC dc0;
dc0.CreateCompatibleDC(destDC);
CBitmap* olddc0 = dc0.SelectObject(bmp);
COLORREF cr = dc0.GetPixel(0,0);//背景
COLORREF cr1 = dc0.SetBkColor(cr); //为什么不正确,有时不能得到正确的掩码
CDC maskdc;
maskdc.CreateCompatibleDC(destDC);
CBitmap maskbmp;
maskbmp.CreateBitmap(w,h,1,1,0);
CBitmap* oldmask = maskdc.SelectObject(&maskbmp);
maskdc.FillSolidRect(0,0,w,h,0x00ffffff);
maskdc.BitBlt(0,0,w,h,&dc0,0,0,SRCCOPY);
// dc0.SetBkColor(cr1); dc0.BitBlt(0,0,w,h,&maskdc,0,0,SRCINVERT);//原图边上变为黑色
mdc.BitBlt(0,0,w,h,&maskdc,0,0,SRCAND);//背景内部变为黑色
mdc.BitBlt(0,0,w,h,&dc0,0,0,SRCPAINT);//合并 destDC->SetBkColor(0x00ffffff);
destDC->BitBlt(x,y,w,h,&mdc,0,0,SRCCOPY);
maskdc.SelectObject(oldmask);
dc0.SelectObject(olddc0);
mdc.SelectObject(oldtbmp);
tbmp.DeleteObject();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货