#pragma once
class CDCEx
{
public:
static bool drawImg(CDC* i_pCDC, CString strSrcPath, CRect* rtDest, CRect* rtSrc, DWORD i_iSign = SRCCOPY);
explicit CDCEx(CSize i_szDest, CDC* i_pCDC, CRect i_rtSrc, DWORD i_iSign = SRCCOPY);
~CDCEx();
void init();
void draw(CRect i_rtDest, CBitmap* i_pBmp, CRect i_rtSrc, DWORD i_iSign = SRCCOPY);
bool drawImg(CString strSrcPath, CRect* rtDest = NULL, CRect* rtSrc = NULL, DWORD i_iSign = SRCCOPY);
CBitmap* save(CSize i_szDest, const CRect& i_rtSrc, DWORD i_iSign = SRCCOPY);
operator CDC*() { return m_pcdcMem; }// 防止用户误用m_pobjMem
const int m_iSceneW;
const int m_iSceneH;
private:
CBitmap* m_pbmpOld;
CDC* m_pcdcMem;
};
//////////////////////////////////////
#include "StdAfx.h"
#include "MFC_2D.h"
#include "WinCE600.h"
#include "COM_IMAGE.h"
#include "AFX.h"
CDCEx::CDCEx(CSize i_szDest, CDC* i_pCDC, CRect i_rtSrc, DWORD i_iSign):
m_pcdcMem(NULL),
m_pbmpOld(NULL),
m_iSceneW(i_szDest.cx),
m_iSceneH(i_szDest.cy)
{
m_pcdcMem = new CDC();
CBitmap* pbmpNew = new CBitmap();
if( NULL == m_pcdcMem || NULL == pbmpNew)
{
throw &std::exception("Failed to CDCEx!");
}
//TRACE1("new cdc: %08x/n", m_pcdcMem);
//TRACE1("new bmp: %08x/n", pbmpNew);
//TRACE1("new cdcEx: %08x/n", this);
int nWidthSrc = i_rtSrc.Width();
int nHeightSrc = i_rtSrc.Height();
m_pcdcMem->CreateCompatibleDC(i_pCDC);
pbmpNew-> CreateCompatibleBitmap(i_pCDC, m_iSceneW, m_iSceneH);
m_pbmpOld = m_pcdcMem -> SelectObject(pbmpNew);
if (m_iSceneW == nWidthSrc && m_iSceneH == nHeightSrc)
m_pcdcMem->BitBlt(0,0, m_iSceneW, m_iSceneH,
i_pCDC,
i_rtSrc.left,i_rtSrc.top, i_iSign);
else
m_pcdcMem->StretchBlt(0,0, m_iSceneW, m_iSceneH,
i_pCDC,i_rtSrc.left,i_rtSrc.top, nWidthSrc, nHeightSrc, i_iSign);
}
CDCEx::~CDCEx()
{
if( NULL != m_pcdcMem)
{
init();
//TRACE1("del cdc: %08x/n", m_pcdcMem);
m_pcdcMem->DeleteDC();
delete m_pcdcMem;
}
m_pcdcMem = NULL;
//TRACE1("del cdcEx: %08x/n", this);
}
void CDCEx::init()
{
if( NULL == m_pcdcMem)
return;
CBitmap* pbmpNew = m_pcdcMem -> SelectObject(m_pbmpOld);
//TRACE1("del bmp: %08x/n", pbmpNew);
pbmpNew->DeleteObject();
delete pbmpNew;
pbmpNew = NULL;
}
void CDCEx::draw(CRect i_rtDest, CBitmap* i_pBmp, CRect i_rtSrc, DWORD i_iSign)
{
if( NULL == m_pcdcMem || NULL == i_pBmp)
return;
CDC dcMemory;
dcMemory.CreateCompatibleDC(m_pcdcMem);
CBitmap* pOldBitmap = dcMemory.SelectObject(i_pBmp);
int nWidthDest = i_rtDest.Width();
int nHeightDest = i_rtDest.Height();
int nWidthSrc = i_rtSrc.Width();
int nHeightSrc = i_rtSrc.Height();
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
m_pcdcMem->BitBlt(i_rtDest.left,i_rtDest.top, nWidthDest, nHeightDest,
&dcMemory, i_rtSrc.left,i_rtSrc.top, i_iSign);
else
m_pcdcMem->StretchBlt(i_rtDest.left,i_rtDest.top, nWidthDest, nHeightDest,
&dcMemory,
i_rtSrc.left,i_rtSrc.top, nWidthSrc, nHeightSrc, i_iSign);
dcMemory.SelectObject(pOldBitmap);
dcMemory.DeleteDC();
}
bool CDCEx::drawImg(CString strSrcPath, CRect* rtDest, CRect* rtSrc, DWORD i_iSign)
{
return drawImg(m_pcdcMem,strSrcPath, rtDest, rtSrc);
}
bool CDCEx::drawImg(CDC* i_pCDC, CString strSrcPath, CRect* rtDest, CRect* rtSrc, DWORD i_iSign)
{
if( NULL == i_pCDC)
return false;
static COM_IMAGE objImg;
objImg.loadFile(strSrcPath);
if( NULL == rtDest)
{
ImageInfo imfo;
objImg.getIImage()->GetImageInfo(&imfo);
CRect rtDt(0,0,imfo.Width,imfo.Height);
if( NULL != rtSrc)
objImg.drawImage(i_pCDC,rtDt,*rtSrc);
else
objImg.getIImage()->Draw(*i_pCDC,rtDt,NULL);
}
else
{
if( NULL != rtSrc)
objImg.drawImage(i_pCDC,*rtDest,*rtSrc);
else
objImg.getIImage()->Draw(*i_pCDC,*rtDest,NULL);
}
objImg.Release();
return true;
}
CBitmap* CDCEx::save(CSize i_szDest, const CRect& i_rtSrc, DWORD i_iSign)
{
if( NULL == m_pcdcMem)
return NULL;
CBitmap* pBmp = new CBitmap();
if( NULL == pBmp)
{
//TRACE(_T("Failed to Copy(Bmp)!"));
return NULL;
}
//TRACE1("new bmp: %08x/n", pBmp);
CDC dcMemory;
int nWidthDest = i_szDest.cx;
int nHeightDest = i_szDest.cy;
int nWidthSrc = i_rtSrc.Width();
int nHeightSrc = i_rtSrc.Height();
dcMemory.CreateCompatibleDC(m_pcdcMem);
pBmp->CreateCompatibleBitmap(m_pcdcMem,nWidthDest,nHeightDest);
CBitmap* pOldBitmap = dcMemory.SelectObject(pBmp);
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
dcMemory.BitBlt(0,0, nWidthDest, nHeightDest,
m_pcdcMem, i_rtSrc.left,i_rtSrc.top, i_iSign);
else
dcMemory.StretchBlt(0,0, nWidthDest, nHeightDest,
m_pcdcMem,i_rtSrc.left,i_rtSrc.top, nWidthSrc, nHeightSrc, i_iSign);
dcMemory.SelectObject(pOldBitmap);
dcMemory.DeleteDC();
return pBmp;
}
本文介绍了一个名为CDCEx的自定义绘图类,该类扩展了MFC中的CDC类,提供了一系列用于绘制图像、位图及保存绘图内容的功能。通过CDCEx可以方便地进行图像的缩放、复制和粘贴等操作。
142

被折叠的 条评论
为什么被折叠?



