www.pudn.com > RMS2000_C.rar > Dib.cpp


// Dib.cpp: implementation of the CDib class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "DrawCli.h" 
#include "Dib.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
#define RECTWIDTH(lpRect)     ((lpRect)->right - (lpRect)->left) 
#define RECTHEIGHT(lpRect)    ((lpRect)->bottom - (lpRect)->top) 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CDib::CDib(LPCTSTR lpcszFileName) 
{ 
	LoadBitMapFile(lpcszFileName);	 
} 
 
CDib::~CDib() 
{ 
	delete []m_lpBmpInfo; 
} 
 
void CDib::LoadBitMapFile(LPCTSTR lpcszFileName) 
{ 
	BITMAPFILEHEADER bmpFileHeader; 
	CFile file; 
	if (!file.Open(lpcszFileName,CFile::modeRead,NULL)) 
	{ 
		m_lpBmpInfo=NULL; 
		m_lpBmpInfoHeader=NULL; 
	 	m_lpColorTable=NULL; 
		m_lpImageData=NULL; 
		m_numColors=0; 
		return; 
	} 
	file.Read((void*)&bmpFileHeader,sizeof(bmpFileHeader)); 
	if (bmpFileHeader.bfType!=0x4d42) 
	{ 
		AfxMessageBox("·ÇλͼÎļþ."); 
		m_lpBmpInfo=NULL; 
		m_lpBmpInfoHeader=NULL; 
	 	m_lpColorTable=NULL; 
		m_lpImageData=NULL; 
		m_numColors=0; 
		file.Close(); 
	} 
	else 
	{ 
		DWORD fileLength=file.GetLength(); 
		DWORD dibSize=fileLength-sizeof(bmpFileHeader); 
		BYTE * pDib=new BYTE[dibSize]; 
		file.Read((void*)pDib,dibSize); 
		file.Close(); 
		m_lpBmpInfo=(LPBITMAPINFO)pDib; 
		m_lpBmpInfoHeader=(LPBITMAPINFOHEADER)pDib; 
	 	m_lpColorTable=(RGBQUAD*)(pDib+m_lpBmpInfoHeader->biSize); 
		if ((m_lpBmpInfoHeader->biClrUsed==0)&&(m_lpBmpInfoHeader->biBitCount<9)) 
			m_numColors=(1<biBitCount); 
		else 
			m_numColors=(UINT)m_lpBmpInfoHeader->biClrUsed; 
		m_lpImageData=(LPBYTE)m_lpColorTable+m_numColors*sizeof(RGBQUAD); 
		m_nBytesPerRow=(GetBmpWidth()+3)/4*4; 
	} 
} 
 
void CDib::Show(CDC* pDC,LPRECT lpRect) 
{ 
	if (!m_lpBmpInfo) return; 
	HPALETTE hPal,hOldPal; 
	if (m_lpBmpInfoHeader->biBitCount<=8) 
	{ 
		LPLOGPALETTE pLogPal=(LPLOGPALETTE) new char[2*sizeof(WORD)+m_numColors*sizeof(PALETTEENTRY)]; 
		pLogPal->palVersion=0x300; 
		pLogPal->palNumEntries=m_numColors; 
		LPRGBQUAD pDibQuad=(LPRGBQUAD)m_lpColorTable; 
		for (UINT i=0;ipalPalEntry[i].peRed=pDibQuad->rgbRed; 
			pLogPal->palPalEntry[i].peGreen=pDibQuad->rgbGreen; 
			pLogPal->palPalEntry[i].peBlue=pDibQuad->rgbBlue; 
			pLogPal->palPalEntry[i].peFlags=0; 
			pDibQuad++; 
		} 
		hPal=::CreatePalette((LPLOGPALETTE)pLogPal); 
		hOldPal=::SelectPalette(pDC->m_hDC,hPal,FALSE); 
	} 
	LONG bmpWidth=GetBmpWidth(); 
	LONG bmpHeight=GetBmpHeight(); 
	pDC->SetStretchBltMode(COLORONCOLOR); 
	StretchDIBits(pDC->m_hDC, 
		lpRect->left,lpRect->top,RECTWIDTH(lpRect),RECTHEIGHT(lpRect), 
		0,0,bmpWidth,bmpHeight, 
		(void*)m_lpImageData,m_lpBmpInfo, 
		DIB_RGB_COLORS,SRCCOPY); 
	if (m_lpBmpInfoHeader->biBitCount<=8) 
	{ 
		::SelectPalette(pDC->m_hDC,hOldPal,FALSE); 
		::DeleteObject(hPal); 
	} 
/* 
    bSuccess = ::StretchDIBits(hDC,                          // hDC 
							   lpDCRect->left,                 // DestX 
							   lpDCRect->top,                  // DestY 
							   RECTWIDTH(lpDCRect),            // nDestWidth 
							   RECTHEIGHT(lpDCRect),           // nDestHeight 
							   lpDIBRect->left,                // SrcX 
							   lpDIBRect->top,                 // SrcY 
							   RECTWIDTH(lpDIBRect),           // wSrcWidth 
							   RECTHEIGHT(lpDIBRect),          // wSrcHeight 
							   lpDIBBits,                      // lpBits 
							   (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo 
							   DIB_RGB_COLORS,                 // wUsage 
							   SRCCOPY);                       // dwROP 
*/ 
}