CMemDC类

#pragma once


class My_CMemDC : public CDC
{
    CSize m_size;
public:
    My_CMemDC()//在构造对象的时候不创建位图
    {
        m_size.cx = m_size.cy = 0;
    }
    My_CMemDC(UINT nBitmap, CDC * pDC = NULL)
    {
        LoadBitmap(nBitmap, pDC);
    }
    My_CMemDC(CString szFile, CDC *pDC = NULL)
    {
        LoadBitmap(szFile, pDC );
    }
    My_CMemDC(int cx, int cy, CDC* pDC = NULL)//构造对象时创建空白位图
    {
        Create(cx, cy, pDC);
    }
    ~My_CMemDC()
    {
        DeleteDC();
    }
    int GetWidth(){ return m_size.cx; }
    int GetHeight(){ return m_size.cy; }
    BOOL DeleteDC()
    {
        if (!GetSafeHdc())
            return FALSE;
        CBitmap *pBitmap = GetCurrentBitmap();
        if (pBitmap)
            pBitmap->DeleteObject();
        return CDC::DeleteDC();
    }
    BOOL Create(int cx, int cy, CDC* pDC = NULL)
    {//创建空白位图
        CBitmap bmp;
        if (!bmp.CreateCompatibleBitmap(pDC, cx, cy))
            return FALSE;
        m_size.cx = cx;
        m_size.cy = cy;
        CreateCompatibleDC(pDC);
        SelectObject(&bmp);
        return TRUE;
    }
    BOOL LoadBitmap(UINT nBitmap, CDC * pDC = NULL)
    {
        CBitmap bmp;
        if (!bmp.LoadBitmap(nBitmap))
            return FALSE;
        BITMAP bm;
        bmp.GetBitmap(&bm);
        m_size.cx = bm.bmWidth;
        m_size.cy = bm.bmHeight;
        CreateCompatibleDC(pDC);
        SelectObject(&bmp);
        return TRUE;
    }
    BOOL LoadBitmap(CString szFile, CDC *pDC = NULL)
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, szFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        if (!hBitmap)
            return FALSE;
        //CBitmap *pBitmap = CBitmap::FromHandle(hBitmap);
        BITMAP bm;
        //pBitmap->GetBitmap(&bm);
        GetObject(hBitmap, sizeof(bm), &bm);
        m_size.cx = bm.bmWidth;
        m_size.cy = bm.bmHeight;
        CreateCompatibleDC(pDC); 
        SelectObject(hBitmap);
        return TRUE;
    }
    //透明图片
    void BitTrans(
        int nXDest,        //目标起点x
        int nYDest,        //目标起点y
        int nWidthDest,    //目标宽度
        int nHeightDest,//目标高度
        CDC* pDC,        //目标DC
        int nXSrc,        //来源起点x
        int nYSrc,        //来源起点y
        COLORREF crTrans//透明色
        )
    {
        My_CMemDC dcImage(nWidthDest, nHeightDest, pDC);//临时DC
        CBitmap bmpMask;
        bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);//创建单色掩码
        CDC dcMask;//掩码DC
        dcMask.CreateCompatibleDC(pDC);
        dcMask.SelectObject(bmpMask);
        //将载入位图的内存DC中的位图,拷贝到临时DC中
        dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY);

        //设置临时DC的透明色
        dcImage.SetBkColor(crTrans);
        //掩码DC的透明区域为白色其他区域为黑色
        dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY);

        //临时DC透明区域为黑色,其他区域保持不变
        dcImage.SetBkColor(RGB(0, 0, 0));
        dcImage.SetTextColor(RGB(255, 255, 255));
        dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND);

        //目标DC透明部分保持屏幕不变,其他部分变成黑色
        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);
    }
    //透明图片拉伸
    void StretchTrans(
        int nXDest,        //目标起点x
        int nYDest,        //目标起点y
        int nWidthDest,    //目标宽度
        int nHeightDest,//目标高度
        CDC* pDC,        //目标DC
        int nXSrc,        //来源起点x
        int nYSrc,        //来源起点y
        int nWidthSrc,    //来源宽度
        int nHeightSrc,    //来源高度
        COLORREF crTrans//透明色
        )
    {
        My_CMemDC dcImage(nWidthDest, nHeightDest, pDC);    //临时DC
        CBitmap bmpMask;
        //创建单色掩码位图
        bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);
        CDC dcMask;
        dcMask.CreateCompatibleDC(pDC);
        dcMask.SelectObject(bmpMask);

        //将载入位图的内存DC中的位图,拷贝到临时DC中
        if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
            dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY);
        else
            dcImage.StretchBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, nWidthSrc, nHeightSrc, SRCCOPY);

        //设置临时DC的透明色
        dcImage.SetBkColor(crTrans);
        //掩码DC的透明区域为白色其他区域为黑色
        dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY);

        //临时DC透明区域为黑色,其他区域保持不变
        dcImage.SetBkColor(RGB(0, 0, 0));
        dcImage.SetTextColor(RGB(255, 255, 255));
        dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND);

        //目标DC透明部分保持屏幕不变,其他部分变成黑色
        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);
    }
};

猜你喜欢

转载自blog.csdn.net/qiukapi/article/details/83930888