绘制透明位图

void CTransBitmapDlg::OnPaint()
    {
        CDC *PDC = GetDC();
        CDC dcImage, dcTrans;
       
        //装入欲显示的位图
        CBitmap bitmap;
        bitmap.LoadBitmap(IDB_BITMAPID);
 
        //取得位图的详细信息
        BITMAP bm;
        bitmap.GetBitmap(&bm);
        int nWidth = bm.bmWidth;
        int nHeight = bm.bmHeight;
 
        //建立与设备环境相关的位图,dcImage中用来装入欲显示的位图
        //dcTrans中用来装入过滤背景色的位图
        dcImage.CreateCompatibleDC(pDC);
        dcTrans.CreateCompatibleDC(pDC);
 
        CBitmap *pOldBitmapImage = dcImage.SelectObject(&bitmap);
 
        // 建立与欲显示的位图等大的单色位图,用来过滤背景色
        CBitmap bitmapTrans;
        // “面具”就在这步做好
        bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
        CBitmap *pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);
        //强行将欲显示的位图的背景色设置为白色,以方便建立dcTrans, 这步很重要。如果你的
        //位图的背景色不是白色的,你只需要修改这一步的参数。
        dcImage.SetBkColor(RGB(255, 255, 255));
        dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);
        //在dcTrans中,背景色变为白色,而主要图像的各种色彩都被设置成黑色
        //显示“面具”,这一步主要目的的主要目的在于让你更能够明白“面具”的真面目
        pDC->BitBlt(0, bm.bmHeight, nWidth, nHeight, &dcTrans, 0, 0, SRCCOPY);
 
        pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
        //该步骤将源位图与目标区域进行异或运算
        pDC->BitBlt(0, 0, nWidth, nHeight, &dcTrans, 0, 0, SRCAND);
 
        //通过dcTrans与目标区域进行“与”操作,建立了与主要图像轮廓一致的黑框以保护图片的主要内容不会改变
        pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
 
        //用黑框位图与源位图进行黑色异或运算,将源码位图中有色彩(除背景色以外)
        //的内容还原。在这步,背景色经过与目标区域进行了两次异或运算,背景色已经被过滤
}
posted @ 2013-09-23 10:45  ★末日3000  阅读(190)  评论(0)    收藏  举报