www.pudn.com > CButtonguitool.rar > BackgroundUtil.cpp


#include "stdafx.h" 
#include "BackgroundUtil.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBackgroundUtil::CBackgroundUtil() 
{ 
} 
 
 
CBackgroundUtil::~CBackgroundUtil() 
{ 
	m_BmpPattern.Detach(); 
	m_BmpPalette.Detach(); 
} 
 
 
BOOL CBackgroundUtil::SetBitmap(UINT uResourceID) 
{ 
	BITMAP bm; 
	BOOL bRet; 
 
	// Detach previous resources 
	m_BmpPattern.Detach();   
	m_BmpPalette.Detach();   
 
	// Default return value 
	bRet = TRUE; 
 
	// Load new bitmap 
	if (uResourceID != 0) 
	{ 
		bRet = GetBitmapAndPalette(uResourceID, m_BmpPattern, m_BmpPalette); 
		// If all ok 
		if (bRet == TRUE) 
		{ 
			// Get dimension 
			m_BmpPattern.GetBitmap(&bm); 
			// Width of the bitmap 
			m_nBmpWidth = bm.bmWidth; 
			// Height of the bitmap 
			m_nBmpHeight = bm.bmHeight; 
		} 
	} 
 
	return bRet; 
} // End of SetBitmap 
 
 
BOOL CBackgroundUtil::GetBitmapAndPalette(UINT nIDResource, CBitmap & bitmap, CPalette & pal) 
{ 
	LPCTSTR lpszResourceName = (LPCTSTR)nIDResource; 
 
	HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),  
		lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION); 
 
	if (hBmp == NULL) return FALSE; 
 
	bitmap.Attach(hBmp); 
 
	// Create a logical palette for the bitmap 
	DIBSECTION ds; 
	BITMAPINFOHEADER &bmInfo = ds.dsBmih; 
	bitmap.GetObject(sizeof(ds), &ds); 
 
	int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount; 
 
	// Create a halftone palette if colors > 256.  
	CClientDC dc(NULL); // Desktop DC 
 
	if(nColors > 256) 
		pal.CreateHalftonePalette(&dc); 
	else 
	{ 
		// Create the palette 
		RGBQUAD *pRGB = new RGBQUAD[nColors]; 
		CDC memDC; 
		memDC.CreateCompatibleDC(&dc); 
		memDC.SelectObject( &bitmap ); 
		::GetDIBColorTable( memDC, 0, nColors, pRGB ); 
		UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors); 
		LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; 
		pLP->palVersion = 0x300; 
		pLP->palNumEntries = nColors; 
		for (int i=0; i < nColors; i++) 
		{ 
			pLP->palPalEntry[i].peRed = pRGB[i].rgbRed; 
			pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen; 
			pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue; 
			pLP->palPalEntry[i].peFlags = 0; 
		} 
		pal.CreatePalette( pLP ); 
		delete[] pLP; 
		delete[] pRGB; 
	} 
	return TRUE; 
} // End of GetBitmapAndPalette 
 
 
BOOL CBackgroundUtil::TileBitmap(CDC* pDC, CRect rc) 
{ 
	CDC MemDC; 
 
	int x = 0, y = 0; 
 
	// If there is a bitmap loaded 
	if (m_BmpPattern.m_hObject != NULL) 
	{ 
		MemDC.CreateCompatibleDC(pDC); 
		CBitmap* pOldBitmap = MemDC.SelectObject(&m_BmpPattern); 
 
		// Tile the bitmap 
		while (y < rc.Height())  
		{ 
			while(x < rc.Width())  
			{ 
				pDC->BitBlt(x, y, m_nBmpWidth, m_nBmpHeight, &MemDC, 0, 0, SRCCOPY); 
				x += m_nBmpWidth; 
			} 
			x = 0; 
			y += m_nBmpHeight; 
		} 
 
		MemDC.SelectObject(pOldBitmap); 
 
		return TRUE; 
	} 
 
	return FALSE; // Normal behaviour 
} // End of TileBitmap