A彡安静氵 2017-12-06 01:04 采纳率: 50%
浏览 1140
已结题

吕鑫老师的MFC透明动画技术为什么我实现不了

这是吕鑫老师CMemDC的封装类,可以用来实现图片的背景透明,但是我却实现不了,请大神看看因为什么,我用的是vs2010版本。

#pragma once
#include <afxwin.h>

class CGMemDC :public CDC
{
    CSize m_size;
public:
    CGMemDC(void)
    {
        m_size.cx = m_size.cy = 0;
    }


    BOOL LoadBitmap(UINT nBitmapID, CDC * pDC=NULL)
    {
        CBitmap bitmap;
        bitmap.LoadBitmapW(nBitmapID);
        BITMAP bm;
        bitmap.GetBitmap(&bm);
        m_size.cx = bm.bmWidth;
        m_size.cy = bm.bmHeight;
        CreateCompatibleDC(pDC);
        SelectObject(bitmap);

        return true;
    }


    CGMemDC(UINT nBitmapID, CDC * pDC=NULL)
    {
        LoadBitmap(nBitmapID,pDC);
    }


    BOOL LoadBitmap(LPCWSTR szBitmapFile, CDC * pDC=NULL)
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),szBitmapFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
        BITMAP bm;
        GetObject(hBitmap,sizeof(bm),&bm);
        m_size.cx = bm.bmWidth;
        m_size.cy = bm.bmHeight;
        CreateCompatibleDC(pDC);
        SelectObject(hBitmap);
        return true;
    }


    CGMemDC(LPCWSTR szBitmapFile, CDC* pDC=NULL)
    {
        LoadBitmap(szBitmapFile,pDC);
    }


    BOOL Create(int cx, int cy, CDC* pDC=NULL)
    {
        CBitmap bitmap;
        bitmap.CreateCompatibleBitmap(pDC,cx,cy);
        m_size.cx = cx;
        m_size.cy = cy;
        CreateCompatibleDC(pDC);
        SelectObject(bitmap);
        return true;
    }


    CGMemDC(int cx, int cy, CDC* pDC=NULL)
    {
        Create(cx,cy,pDC);
    }


    BOOL DeleteDC(void)
    {
        if(!GetSafeHdc())
            return true;
        CBitmap *pBitmap = GetCurrentBitmap();
        pBitmap->DeleteObject();

        return CDC::DeleteDC();
    }

    ~CGMemDC(void)
    {
        DeleteDC();
    }

    inline int Width()
    {
        return m_size.cx;
    }

    inline int Height()
    {
        return m_size.cy;
    }

    /////增加显示透明位图的代码
    void BitTrans(
        int nXDest,
        int nYDest,
        int nWidthDest,
        int nHeightDest,
        CDC * pDC,
        int nXSrc,
        int nYSrc,
        COLORREF crTrans)
    {
        CGMemDC dcImage(nWidthDest,nHeightDest,pDC);
        CBitmap bmpMask;
        bmpMask.CreateBitmap(nWidthDest,nHeightDest,1,1,NULL);
        CDC dcMask;
        dcMask.CreateCompatibleDC(pDC);
        dcMask.SelectObject(bmpMask);

        dcImage.BitBlt(0,0,nWidthDest,nHeightDest,this,nXSrc,nYSrc,SRCCOPY);

        dcImage.SetBkColor(crTrans);

        dcMask.BitBlt(0,0,nWidthDest,nHeightDest,&dcImage,0,0,SRCCOPY);

        dcImage.SetBkColor(RGB(0,0,0));
        dcImage.SetTextColor(RGB(255,255,255));
        dcImage.BitBlt(0,0,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND);

        pDC->SetBkColor(RGB(255,255,255));
        pDC->SetTextColor(RGB(0,0,0));
        pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND);
        pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcImage,0,0,SRCPAINT);
    }
};
 #include "GMemDC.h"
// CTrans 对话框

class CTrans : public CDialogEx
{
    CGMemDC m_dc;

dc.BitBlt函数是将原图输出,dc.BitTrans是透明输出,敲得代码跟书上一样,但是我的却没有实现,是因为版本不一样吗?

 void CTrans::OnPaint()
{
    CPaintDC dc(this); // device context for painting

    if(!m_dc)
        m_dc.LoadBitmapW(IDB_BITMAP3);

    dc.BitBlt(0,0,m_dc.Width(),m_dc.Height(),&m_dc,0,0,SRCCOPY);

    m_dc.BitTrans(m_dc.Width(),0,m_dc.Width(),m_dc.Height(),&dc,0,0,RGB(255,0,255));

}
  • 写回答

1条回答

  • weixin_41291388 2017-12-06 03:17
    关注

    dcImage.BitBlt(0,0,nWidthDest,nHeightDest,this,nXSrc,nYSrc,SRCCOPY);

        dcImage.SetBkColor(crTrans);
    
        dcMask.BitBlt(0,0,nWidthDest,nHeightDest,&dcImage,0,0,SRCCOPY);
    
        dcImage.SetBkColor(RGB(0,0,0));
        dcImage.SetTextColor(RGB(255,255,255));
        dcImage.BitBlt(0,0,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND);
    
        pDC->SetBkColor(RGB(255,255,255));
        pDC->SetTextColor(RGB(0,0,0));
        pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND);
        pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcImage,0,0,SRCPAINT);
    
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?