您的位置:首页 > 其它

MFC透明位图显示函数

2010-02-25 17:21 357 查看
研究好久才弄好,注释的比较详细,不明白的函数可以参考MSDN

bool TransparentDIB(CBitmap * dib, /*要绘制的位图*/
CDC * pDC, /*目标DC*/
CRect * rct, /*目标矩形*/
COLORREF transColor, /*透明色*/
bool bStretch /*是否拉伸位图以适应目标矩形*/)
{
//验证参数
if(dib == NULL || pDC == NULL || rct == NULL)
return false;

int nWidth;
int nHeight;

//位图信息对象
BITMAP w_bitmap_info;
//获取位图信息
dib->GetBitmap(&w_bitmap_info);
//新建设备上下文
CDC w_memoryDC;
//创建兼容内存DC
w_memoryDC.CreateCompatibleDC(pDC);

//根据拉伸状态获得图像实际绘制尺寸
if(bStretch)
{
nWidth = rct->Width();
nHeight = rct->Height();
}
else
{
nWidth = w_bitmap_info.bmWidth;
nHeight = w_bitmap_info.bmHeight;
}

w_memoryDC.SelectObject(dib);//选入位图对象
w_memoryDC.SetBkColor(transColor);//设置透明色
CDC w_maskDC;//创建兼容内存DC作为掩码DC
w_maskDC.CreateCompatibleDC(pDC);//创建兼容内存DC作为掩码DC
CBitmap w_maskBitmap;//创建新位图作为掩码位图
w_maskBitmap.CreateBitmap(w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,1,1,NULL);
//创建新位图作为掩码位图
w_maskDC.SelectObject(&w_maskBitmap);//选入掩码位图

w_maskDC.BitBlt(0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,&w_memoryDC,0,0,SRCCOPY);
//SRCCOPY方式将源位图以原始大小绘制到掩码DC
pDC->StretchBlt(0,0,nWidth,nHeight,&w_memoryDC,0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,SRCINVERT);
//SRCINVERT方式将源位图拉伸绘制到窗口DC
pDC->StretchBlt(0,0,nWidth,nHeight,&w_maskDC,0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,SRCAND);
//SRCAND方式将掩码位图拉伸绘制到窗口DC
pDC->StretchBlt(0,0,nWidth,nHeight,&w_memoryDC,0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,SRCINVERT);
//SRCINVERT方式将源位图拉伸绘制到窗口DC

//完成绘制
w_memoryDC.DeleteDC();//删除内存DC
w_maskDC.DeleteDC();//删除掩码DC

return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: