|
默认不是就透明的啊?! 背景颜色不要设置....
如果自绘的话,那么以下函数是基础
//画透明图片
void CMyButton::DrawTransParent(CBitmap &bmp,int const x,int const y,int const cx,int const cy,
int const srcx,int const srcy,CDC *pDC,COLORREF TransparentColor)
{
//定义源、掩码、透明绘制环境
CDC SrcDC,MaskDC,TransDC;
//定义掩码、透明位图
CBitmap MaskBmp,TransBmp;
BITMAP bm;
//创建源、掩码、透明绘制环境
SrcDC.CreateCompatibleDC(pDC);
MaskDC.CreateCompatibleDC(pDC);
TransDC.CreateCompatibleDC(pDC);
//得到位图结构
bmp.GetBitmap(&bm);
//创建透明位图
TransBmp.CreateCompatibleBitmap(pDC,cx,cy);
//创建掩码位图
MaskBmp.CreateBitmap(cx,cy,1,1,NULL);
//将透明位图对象选入到透明绘图环境
CBitmap *pTransBmp = TransDC.SelectObject(&TransBmp);
//将目标位图绘制到透明位图中
TransDC.BitBlt(x,y,cx,cy,pDC,srcx,srcy,SRCCOPY);
//将实际位图对象选入源绘图环境
CBitmap *pSrcBmp = SrcDC.SelectObject(&bmp);
//设置背景为透明模式
SrcDC.SetBkMode(TRANSPARENT);
//设置背景色
if (TransparentColor)
SrcDC.SetBkColor(TransparentColor);
else
{
COLORREF col = SrcDC.GetPixel(0,bm.bmHeight-1);
SrcDC.SetBkColor(col);
}
CBitmap *pMaskBmp = MaskDC.SelectObject(&MaskBmp);
//将源绘图环境绘制到掩码绘图环境中
MaskDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCCOPY);
//将源位图和透明位图进行异或操作融合
TransDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCINVERT);
//将透明位图和掩码位图进行与操作
TransDC.BitBlt(x,y,cx,cy,&MaskDC,0,0,SRCAND);
//再将源位图和透明位图进行异或操作
TransDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCINVERT);
//此时将透明位图绘制到目标设备上
BOOL bRet = pDC->BitBlt(x,y,cx,cy,&TransDC,srcx,srcy,SRCCOPY);
//绘制绘图对象,并释放相应绘图环境和位图对象
SrcDC.SelectObject(pSrcBmp);
SrcDC.DeleteDC();
TransDC.SelectObject(pTransBmp);
TransBmp.DeleteObject();
TransDC.DeleteDC();
MaskDC.SelectObject(pMaskBmp);
MaskDC.DeleteDC();
MaskBmp.DeleteObject();
} |
|