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
*/
}