//代码如下,有些绘制出来是透明和,有的则不透明
//跟踪发现对于有些位图不能得到正确的掩码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();
    }