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();
}
BitBlt实现透明背景贴图
最新推荐文章于 2024-05-22 23:31:04 发布