绘制透明位图
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);
//用黑框位图与源位图进行黑色异或运算,将源码位图中有色彩(除背景色以外)
//的内容还原。在这步,背景色经过与目标区域进行了两次异或运算,背景色已经被过滤
}