位图处理:为什么有时绘制的位图不透明?解决方案
位图处理:为什么有时绘制的位图不透明?
//代码如下,有些绘制出来是透明和,有的则不透明
//跟踪发现对于有些位图不能得到正确的掩码
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);
//代码如下,有些绘制出来是透明和,有的则不透明
//跟踪发现对于有些位图不能得到正确的掩码
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);