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