BitBlt实现透明背景贴图

void CBitBltDlg::OnPaint()
{
		CPaintDC dc(this); // 用于绘制的设备上下文

		CRect rect;
		GetClientRect(&rect);
		int center_x = rect.Width() / 2;
		int center_y = rect.Height() / 2;

		//背景位图
		CBitmap bmpBk;
		bmpBk.LoadBitmap(IDB_BKG);
		//背景兼容dc
		CDC memdcBk;
		memdcBk.CreateCompatibleDC(&dc);
		CBitmap* pOldBitmapBk = memdcBk.SelectObject(&bmpBk);

		//获取背景位图图像尺寸
		BITMAP bmpinfoBk;
		bmpBk.GetBitmap(&bmpinfoBk);
		int cxBk = bmpinfoBk.bmWidth;
		int cyBk = bmpinfoBk.bmHeight;


		//源位图
		CBitmap bmpSrc;  
		bmpSrc.LoadBitmap(IDB_READY);

		//获取源图像尺寸
		BITMAP bmpinfo;
		bmpSrc.GetBitmap(&bmpinfo);
		int cx = bmpinfo.bmWidth;
		int cy = bmpinfo.bmHeight;

		//源位图的兼容dc
		CDC memdcSrc;
		memdcSrc.CreateCompatibleDC(&dc);
		CBitmap* pOldBitmapSrc= memdcSrc.SelectObject(&bmpSrc);

		//掩码位图 单值位图
		CBitmap bmpMonoMask;
		bmpMonoMask.CreateBitmap(cx, cy, 1, 1, nullptr);

		//掩码设备dc
		CDC dcMono;                       
		dcMono.CreateCompatibleDC(&dc);
		CBitmap* pOldBitmapMonoMask = dcMono.SelectObject(&bmpMonoMask);

		//指定源位图背景颜色
		COLORREF color = memdcSrc.GetPixel(2, 2);
		memdcSrc.SetBkColor(color);

		//源位图中 将刚刚设置的背景颜色转换到掩码位图  背景对应到单色位图中的1(白), 其他值变为0(黑)
     	dcMono.BitBlt(0, 0, cx, cy, &memdcSrc, 0, 0, SRCCOPY);


		

		//输出到目标上
		{		
			dc.BitBlt(0, cy * 5, cx, cy, &memdcSrc, 0, 0, SRCCOPY);  //源图直接显示到目标  

			int i = 0;
			dc.BitBlt(cx * i, 0, cx, cy, &dcMono, 0, 0, SRCCOPY);  //演示输出掩码位图效果  
			++i;

			//设置目标窗口dc的背景 颜色值  讲mask位图转换为目标位图 1对应目标背景 0对应前景
			COLORREF DlgBkColor = dc.GetPixel(center_x, center_y);
			dc.SetBkColor(DlgBkColor);

			dc.SetTextColor(RGB(140, 10, 46));//设置目标前景 颜色值  与 mask位图中的 0对应
			dc.BitBlt(cx * i, 0, cx, cy, &dcMono, 0, 0, SRCCOPY);
			++i;


			//显示透明效果 目标 异或 源图与掩码异或源图

			dc.BitBlt(cx * i, 0, cxBk, cyBk, &memdcBk, 0, 0, SRCCOPY);//目标
			
			dc.BitBlt(center_x, center_y, cx, cy, &dcMono, 0, 0, SRCAND);//生成黑色前景,原背景区域

			dc.BitBlt(center_x, center_y, cx, cy, &memdcSrc, 0, 0, SRCINVERT);//目标 异或 源图
			dc.BitBlt(center_x, center_y, cx, cy, &dcMono, 0, 0, SRCAND);//目标 异或 源图 与掩码
			dc.BitBlt(center_x, center_y, cx, cy, &memdcSrc, 0, 0, SRCINVERT);//目标 异或 源图 与掩码异或源图
		}
		



		//释放
		memdcBk.SelectObject(pOldBitmapBk);
		bmpBk.DeleteObject();
		memdcBk.DeleteDC();


		memdcSrc.SelectObject(pOldBitmapSrc);
		bmpSrc.DeleteObject();
		memdcSrc.DeleteDC();

		dcMono.SelectObject(pOldBitmapMonoMask);
		bmpMonoMask.DeleteObject();
		dcMono.DeleteDC();
		CDialogEx::OnPaint();
	
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值