VC中的位图透明

1、VC6中,需要自己写函数代码

声明:


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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值