www.pudn.com > testthermometer.rar > MemDC.h


class CMemDC : public CDC 
{ 
public: 
	CMemDC(CDC* pDC, LPRECT pRect = NULL, BOOL fCopyOld = FALSE, BOOL fUsePalette = FALSE) : CDC() 
	{ 
		ASSERT(pDC != NULL); 
 
		m_pDC = pDC; 
		m_pOldBitmap = NULL; 
		m_bMemDC = !pDC->IsPrinting(); 
		m_fUsePalette = fUsePalette; 
 
		if (m_bMemDC)  
		{ 
			if(pRect) 
				m_rect = *pRect; 
			else 
				pDC->GetClipBox(&m_rect); 
			CreateCompatibleDC(pDC); 
			m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height()); 
			m_pOldBitmap = SelectObject(&m_bitmap); 
			SetWindowOrg(m_rect.left, m_rect.top); 
			if(fCopyOld) 
				BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), 
				       m_pDC, m_rect.left, m_rect.top, SRCCOPY); 
		} 
		else   
		{ 
			m_bPrinting = pDC->m_bPrinting; 
			m_hDC = pDC->m_hDC; 
			m_hAttribDC = pDC->m_hAttribDC; 
		} 
	} 
	 
	~CMemDC() 
	{ 
		if (m_bMemDC)  
		{	  
			CPalette pal, *pOldPal=NULL; 
			if(m_fUsePalette && CreatePalette(pal)) 
			{ 
				pOldPal = m_pDC->SelectPalette(&pal, FALSE); 
				m_pDC->RealizePalette(); 
			} 
			m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), 
			              this, m_rect.left, m_rect.top, SRCCOPY); 
 
			if(pOldPal) 
				m_pDC->SelectPalette(pOldPal, TRUE); 
			SelectObject(m_pOldBitmap); 
		}  
		else  
		{ 
			m_hDC = m_hAttribDC = NULL; 
		} 
	} 
 
	BOOL CreatePalette(CPalette& pal, CDC* pDC = NULL) 
	{ 
		if(!pDC) pDC = this; 
		if(!(pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE)) 
			return FALSE; 
 
		const int nColors = 236; 
		RGBQUAD rgb[nColors]; 
		::GetDIBColorTable(pDC->m_hDC, 0, nColors, rgb); 
 
		LPLOGPALETTE lpPal = (LPLOGPALETTE) new BYTE[sizeof(LOGPALETTE) + (nColors*sizeof(PALETTEENTRY))]; 
		lpPal->palVersion = 0x300;        
		lpPal->palNumEntries = nColors; 
 
		for (int i = 0; i < nColors; i++)        
		{ 
			lpPal->palPalEntry[i].peRed = rgb[i].rgbRed; 
			lpPal->palPalEntry[i].peGreen = rgb[i].rgbGreen; 
			lpPal->palPalEntry[i].peBlue = rgb[i].rgbBlue; 
			lpPal->palPalEntry[i].peFlags = 0; 
		} 
		VERIFY(pal.CreatePalette(lpPal)); 
   
		delete lpPal; 
		return TRUE; 
	} 
 
	CMemDC* operator->() {return this;} 
		 
	operator CMemDC*() {return this;} 
 
private: 
	CBitmap  m_bitmap;       
	CBitmap* m_pOldBitmap;   
	CDC*     m_pDC;          
	CRect    m_rect;         
	BOOL     m_bMemDC;       
	BOOL     m_fUsePalette; 
};