位图的巧妙运算得到透明图片的效果

来源:互联网 发布:微信小游戏 源码 编辑:程序博客网 时间:2024/05/09 02:40
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);//载入底层位图
BITMAP bmp;
bitmap.GetBitmap(&bmp);
int nWidth = bmp.bmWidth;
int nHeight = bmp.bmHeight;




CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&bitmap);
pDC->BitBlt(0, 0, nWidth, nHeight, &dcMem, 0, 0, SRCCOPY);//将底层位图打印


bitmap.DeleteObject();
bitmap.LoadBitmap(IDB_BITMAP2);//载入做掩膜运算的图片
bitmap.GetBitmap(&bmp);
nWidth = bmp.bmWidth;
nHeight = bmp.bmHeight;
dcMem.SelectObject(&bitmap);




CDC dcMask;
dcMask.CreateCompatibleDC(pDC);
CBitmap bitmapMask;
bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL);//创建单色的掩码位图
dcMask.SelectObject(bitmapMask);




dcMem.SetBkColor(RGB(0, 0, 0));//此颜色为做掩膜运算中需要显示部分的颜色,将其设置为透明色
dcMask.BitBlt(0, 0, nWidth, nHeight, &dcMem, 0, 0, SRCCOPY);//则dcMask中对应透明色的部分为白色,其他为黑色




pDC->BitBlt(0, 0, nWidth, nHeight, &dcMem, 0, 0, SRCINVERT);//首先与底层图片异或一次
pDC->BitBlt(0, 0, nWidth, nHeight, &dcMask, 0, 0, SRCAND);//与掩码位图与一次将留下对应透明色的部分
pDC->BitBlt(0, 0, nWidth, nHeight, &dcMem, 0, 0, SRCINVERT);//再异或一次将对应透明色的部分还原为底层图片,而其他部分变为做掩膜运算的图片