位图处理:为什么有时绘制的位图不透明?解决方案

位图处理:为什么有时绘制的位图不透明?
//代码如下,有些绘制出来是透明和,有的则不透明
//跟踪发现对于有些位图不能得到正确的掩码

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