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