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