HDCBuf

    技术2025-06-26  13

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

     

    最新回复(0)