HDCBuf

来源:互联网 发布:deform软件中文版下载 编辑:程序博客网 时间:2024/04/30 23:57

#pragma once
/********************************************************************
 file name :  g:/工具源码/WinCE/CE600/HDCBuf.h
 author  : Clark
 created  : 27:1:2011   16:09
 purpose  : 
*********************************************************************/

 

class HDCBuf
{
public:
 HDCBuf(HDC* pDC, const RECT* pRect = NULL);
 ~HDCBuf();
 void fillRect(COLORREF clr, RECT* prtDest = NULL);
 void drawBmp(HBITMAP* pBmp, RECT* prtDest = NULL, RECT* prtSrc = NULL, DWORD i_iSign = SRCCOPY);
 void drawText(LPCTSTR szText, RECT rtDest, int iH, COLORREF cls = RGB(0,0,0),
  UINT uSign = DT_LEFT|DT_TOP, BOOL bUnderline = FALSE);
 HDC* getHDC();
 

private:
 RECT  m_rect;
 HBITMAP  m_bmpBuf;
 HBITMAP  m_bmpOld;
 HDC*  m_phdcMain;
 HDC   m_hdcBuf;
};

 

//////////////////////////////////////////////////////

 

 

#include "StdAfx.h"
#include <math.h>
#include "HDCBuf.h"
//#include "COMImage.h"
//#include "MFC600.h"

HDCBuf::HDCBuf( HDC* pDC, const RECT* pRect /*= NULL*/ ):
m_phdcMain(NULL),
m_bmpOld(NULL)
{
 ASSERT(NULL != pDC);
 m_phdcMain = pDC;
 if( NULL == pRect)
 {
  GetClipBox(*m_phdcMain, &m_rect);
 }
 else
 {
  m_rect = *pRect;
 }

 int iW = m_rect.right-m_rect.left;
 int iH = m_rect.bottom-m_rect.top;
 m_hdcBuf = CreateCompatibleDC(*m_phdcMain);
 m_bmpBuf = CreateCompatibleBitmap(*m_phdcMain, iW, iH);
 m_bmpOld = (HBITMAP)SelectObject(m_hdcBuf,m_bmpBuf);
 BitBlt(m_hdcBuf, m_rect.left, m_rect.top, iW, iH,
  *m_phdcMain,m_rect.left, m_rect.top, SRCCOPY);
}

HDCBuf::~HDCBuf()
{
 if( NULL != m_phdcMain)
 {
  int iW = m_rect.right-m_rect.left;
  int iH = m_rect.bottom-m_rect.top;
  BitBlt(*m_phdcMain, m_rect.left, m_rect.top, iW, iH,
   m_hdcBuf,m_rect.left, m_rect.top, SRCCOPY);
  m_bmpBuf = (HBITMAP)SelectObject(m_hdcBuf,m_bmpOld); 
  DeleteDC(m_hdcBuf);
  DeleteObject(m_bmpBuf);
 }
 else
 {   
  m_phdcMain = NULL;
  m_bmpOld = NULL;
 } 
}

void HDCBuf::drawBmp( HBITMAP* pBmp, RECT* prtDest /*= NULL*/, RECT* prtSrc /*= NULL*/, DWORD i_iSign /*= SRCCOPY*/ )
{
 ASSERT(NULL != pBmp);

 HDC dcMemory = CreateCompatibleDC(m_hdcBuf);
 HBITMAP bmpOld = (HBITMAP)SelectObject(dcMemory,*pBmp);


 if( NULL == prtDest && NULL == prtSrc)
 {//无变化贴图
  BITMAP bmp;
  GetObject(*pBmp,   sizeof(bmp),   (LPSTR)&bmp);  
  BitBlt(m_hdcBuf, 0,0, bmp.bmWidth, bmp.bmHeight, dcMemory, 0, 0, i_iSign);
 }
 else if( NULL != prtDest && NULL == prtSrc)
 {//默认型到指定型
  int iW = prtDest->right - prtDest->left;
  int iH = prtDest->bottom - prtDest->top;
  BitBlt(m_hdcBuf, prtDest->left,prtDest->top, iW, iH, dcMemory, 0, 0, i_iSign);
 }
 else if( NULL == prtDest && NULL != prtSrc)
 {//指定型到默认型
  int iW = prtDest->right - prtDest->left;
  int iH = prtDest->bottom - prtDest->top;
  int iSrcW = prtSrc->right - prtSrc->left;
  int iSrcH = prtSrc->bottom - prtSrc->top;
  StretchBlt(m_hdcBuf,m_rect.left,m_rect.top, iW, iH,
   dcMemory, prtSrc->left, prtSrc->top, iSrcW, iSrcH, i_iSign);
 }
 else
 {//指定形到指定形
  int iW = prtDest->right - prtDest->left;
  int iH = prtDest->bottom - prtDest->top;
  int iSrcW = prtSrc->right - prtSrc->left;
  int iSrcH = prtSrc->bottom - prtSrc->top;
  StretchBlt(m_hdcBuf,prtDest->left,prtDest->top, iW, iH,
   dcMemory, prtSrc->left, prtSrc->top, iSrcW, iSrcH, i_iSign);
 }

 SelectObject(dcMemory,bmpOld);
 DeleteDC(dcMemory);
}

void HDCBuf::drawText( LPCTSTR szText, RECT rtDest, int iH, COLORREF cls, UINT uSign, BOOL bUnderline)
{
 LOGFONT lf;
 memset(&lf,0,sizeof(lf));
 lf.lfWeight = FW_BOLD;//FW_SEMIBOLD
 lf.lfHeight = iH;
 wcscpy(lf.lfFaceName,TEXT("Arial"));//Tahoma
 HFONT hNewFont = CreateFontIndirect(&lf);
 HFONT hOldFont = (HFONT)SelectObject(m_hdcBuf , hNewFont);
 int iOldBkSign = SetBkMode(m_hdcBuf, TRANSPARENT);
 COLORREF clrOld = SetTextColor(m_hdcBuf,cls);

 DrawText(m_hdcBuf, szText, _tcslen(szText), &rtDest, uSign);

 SetBkMode(m_hdcBuf, iOldBkSign);
 SetTextColor(m_hdcBuf,clrOld);
 SelectObject(m_hdcBuf, hOldFont);
 DeleteObject(hNewFont);
}

void HDCBuf::fillRect( COLORREF clr, RECT* prtDest /*= NULL*/ )
{
 HBRUSH br = CreateSolidBrush(clr);
 if( NULL == prtDest)
 {
  FillRect(m_hdcBuf, &m_rect, br);
 }
 else
 {
  FillRect(m_hdcBuf, prtDest, br);
 }
 DeleteObject(br);
}

HDC* HDCBuf::getHDC()
{
 return &m_hdcBuf;
}

 

原创粉丝点击