CDCEx

本文介绍了一个名为CDCEx的自定义绘图类,该类扩展了MFC中的CDC类,提供了一系列用于绘制图像、位图及保存绘图内容的功能。通过CDCEx可以方便地进行图像的缩放、复制和粘贴等操作。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值