|
void CTransparentcolorDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);
//定义位图对象
CBitmap bmp;
//加载位图
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bm;
bmp.GetBitmap(&bm);
//采用透明方式显示位图
// DrawTransparent();
DrawTransparent(bmp,0,0,bm.bmWidth,bm.bmHeight,0,0,&dc,NULL);
bmp.DeleteObject();
}
/****************************************************/
// 绘制透明位图
//入口参数: bmp;准备绘图的对象
//x,y,cx,cy,表示绘制到屏幕上的区域
//srcx,srcy,表示从位图的那个起点地方开始画
//pDC :目标绘制环境;
//transparent 表示透明色,如果设置NULL,设置位图左下角颜色为透明;
//出口参数:pDC目标绘制环境
/****************************************************/
void CTransparentcolorDlg::DrawTransparent(CBitmap &bmp,int x,int y,int cx,int cy,int srcx,int srcy,CDC *pDC,COLORREF TransParentColor)
{
//定义源,掩码,透明绘制环境
CDC SrcDC,MaskDC,TrancDC;
//定义掩码,和透明位图;
CBitmap Maskbmp,Trancbmp;
BITMAP bm;
//创建源,掩码,透明绘制环境
SrcDC.CreateCompatibleDC(pDC);
MaskDC.CreateCompatibleDC(pDC);
TrancDC.CreateCompatibleDC(pDC);
//得到位图结构
bmp.GetBitmap(&bm);
//创建透明位图
Trancbmp.CreateCompatibleBitmap(pDC,cx,cy);
//创建掩码位图
Maskbmp.CreateBitmap(cx,cy,1,1,NULL);
//将透明位图对象选入透明位图环境
CBitmap *ptrancbmp= TrancDC.SelectObject(&Trancbmp);
//将目标位图绘制到透明位图
TrancDC.BitBlt(x,y,cx,cy,pDC,srcx,srcy,SRCCOPY);
//将实际位图对象选入源绘图环境
CBitmap *Srcbitmap =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,srcx,srcy,SRCCOPY);
//将透明位图和掩码位图进行与操作
TrancDC.BitBlt(x,y,cx,cy,&MaskDC,0,0,SRCAND);
//在将源码和透明位图进行与或操作
TrancDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCINVERT);
//将透明位图绘制到目标设备
BOOL bRet =pDC->BitBlt(x,y,cx,cy,&TrancDC,srcx,srcy,SRCCOPY);
//绘制绘图环境对象,和释放相应的绘图环境和对象;
SrcDC.SelectObject(Srcbitmap);
SrcDC.DeleteDC();
TrancDC.SelectObject(ptrancbmp);
Trancbmp.DeleteObject();
TrancDC.DeleteDC();
MaskDC.SelectObject(pMaskBMP);
MaskDC.DeleteDC();
Maskbmp.DeleteObject();
}
|
|