声明:
void TransparentBlt( CDC* hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
CDC* hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
);
定义:
void TransparentBlt( CDC* hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
CDC* hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
CBitmap hImageBMP;
hImageBMP.CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);// 创建兼容位图
CBitmap hMaskBMP;
hMaskBMP.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);// 创建单色掩码位图
CDC hImageDC;
CDC hMaskDC;
hImageDC.CreateCompatibleDC(hdcDest);
hMaskDC.CreateCompatibleDC(hdcDest);
CBitmap* hOldImageBMP = hImageDC.SelectObject(&hImageBMP);
CBitmap* hOldMaskBMP = hMaskDC.SelectObject(&hMaskBMP);
// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
hImageDC.BitBlt(0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
hImageDC.StretchBlt(0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 设置透明色
hImageDC.SetBkColor(crTransparent);
// 生成透明区域为白色,其它区域为黑色的掩码位图
hMaskDC.BitBlt(0, 0, nWidthDest, nHeightDest, &hImageDC, 0, 0, SRCCOPY);
// 生成透明区域为黑色,其它区域保持不变的位图
hImageDC.SetBkColor(RGB(0,0,0));
hImageDC.SetTextColor(crTransparent);
hImageDC.BitBlt(0, 0, nWidthDest, nHeightDest, &hMaskDC, 0, 0, SRCAND);
// 透明部分保持屏幕不变,其它部分变成黑色
hdcDest->SetBkColor(crTransparent);
hdcDest->SetTextColor(RGB(0,0,0));
hdcDest->BitBlt(nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, &hMaskDC, 0, 0, SRCAND);
// "或"运算,生成最终效果
hdcDest->BitBlt(nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, &hImageDC, 0, 0, SRCPAINT);
// 清理、恢复
hImageDC.SelectObject(hOldImageBMP);
hImageDC.DeleteDC();
hMaskDC.SelectObject(hOldMaskBMP);
hMaskDC.DeleteDC();
hImageBMP.DeleteObject();
hMaskBMP.DeleteObject();
}
使用:
void CCurveStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
BITMAP bmInfo;
m_Bmp.GetBitmap(&bmInfo);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, bmInfo.bmWidth, bmInfo.bmHeight);
CBitmap* pOldBmp = MemDC.SelectObject(&bmp);
CDC MemDC1;
MemDC1.CreateCompatibleDC(&dc);
CBitmap* pOldBmp1 = MemDC1.SelectObject(&m_Bmp);
MemDC.BitBlt(0, 0, bmInfo.bmWidth, bmInfo.bmHeight, &MemDC1, 0, 0, SRCCOPY);
MemDC1.SelectObject(&m_TmpBmp);
TransparentBlt(&MemDC, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight,
&MemDC1, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, RGB(255, 255, 255));
CRect rt;
GetClientRect(&rt);
dc.BitBlt(0, 0, bmInfo.bmWidth, bmInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBmp);
MemDC.DeleteDC();
MemDC1.SelectObject(pOldBmp1);
MemDC1.DeleteDC();
bmp.DeleteObject();
}
2、在vs2003或者vs2005中
// 设置要显示的位图
VOID CBmpStatic::SetBmp(UINT uBmpID)
{
if (m_bBmpCreated)
{
m_bmp.DeleteObject();
}
CRect rt;
GetClientRect(&rt);
CDC* pDC = GetDC();
m_bBmpCreated = m_bmp.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
if (!m_bBmpCreated)
{
ReleaseDC(pDC);
return;
}
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldBmp1 = MemDC.SelectObject(&m_bmp);
CBitmap bmp;
bmp.LoadBitmap(IDB_STATIC_BITMAP);
CDC TmpDC1;
TmpDC1.CreateCompatibleDC(pDC);
CBitmap* pOldBmp2 = TmpDC1.SelectObject(&bmp);
BITMAP bmInfo;
m_bmp.GetBitmap(&bmInfo);
MemDC.BitBlt(0, 0, rt.Width(), rt.Height(), &TmpDC1, 0, 0, SRCCOPY);
TmpDC1.SelectObject(pOldBmp2);
TmpDC1.DeleteDC();
bmp.DeleteObject();
CDC TmpDC2;
TmpDC2.CreateCompatibleDC(pDC);
CBitmap bmpTmp;
bmpTmp.LoadBitmap(uBmpID);
pOldBmp2 = TmpDC2.SelectObject(&bmpTmp);
BITMAP bmInfo2;
bmpTmp.GetBitmap(&bmInfo2);
MemDC.TransparentBlt(0, 0, bmInfo2.bmWidth, bmInfo2.bmHeight, &TmpDC2, 0, 0,
bmInfo2.bmWidth, bmInfo2.bmHeight, RGB(255, 255, 255));
TmpDC2.SelectObject(pOldBmp2);
TmpDC2.DeleteDC();
bmpTmp.DeleteObject();
pDC->BitBlt(0, 0, rt.Width(), rt.Height(), &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBmp1);
MemDC.DeleteDC();
ReleaseDC(pDC);
return;
}