BOOL CDib::Draw(CDC *pDC)
{
StretchDIBits(pDC->m_hDC,0,0,BitMapInfo.BitMIH.biWidth,BitMapInfo.BitMIH.biHeight,0,0,BitMapInfo.BitMIH.biWidth,BitMapInfo.BitMIH.biHeight,pDataDib,(BITMAPINFO *)&BitMapInfo,BI_RGB,SRCCOPY);
return(TRUE);
}
BOOL CDib::SetPalette(CDC *pDC) //参照《VC++6.0》
{
CPalette *pOldPalette;
pOldPalette=pDC->SelectPalette(&m_Palette,FALSE);
pDC->RealizePalette();
pDC->SelectPalette(pOldPalette,FALSE);
return(TRUE);
}
void CDib::ImageHeaderMake(short nCols, short nRows, unsigned long nFrameSize) //自己独立编写
{
int nPaletteSize = sizeof(RGBQUAD)*256;
//BITMAPINFO = BITMAPINFOHEADER + RGBQUAD
BitMapInfo.BitMIH.biSize=sizeof(BITMAPINFOHEADER);
BitMapInfo.BitMIH.biWidth=nCols;
BitMapInfo.BitMIH.biHeight=nRows;
BitMapInfo.BitMIH.biPlanes=1;
BitMapInfo.BitMIH.biBitCount=8;
BitMapInfo.BitMIH.biCompression=0;
BitMapInfo.BitMIH.biSizeImage=nFrameSize;
BitMapInfo.BitMIH.biXPelsPerMeter=2835;
BitMapInfo.BitMIH.biYPelsPerMeter=2835;
BitMapInfo.BitMIH.biClrUsed=256;
BitMapInfo.BitMIH.biClrImportant=256;
for(int i=0; i<256; i++)
{
BitMapInfo.RgbQ[i].rgbBlue=i;
BitMapInfo.RgbQ[i].rgbGreen=i;
BitMapInfo.RgbQ[i].rgbRed=i;
}
}
void CDib::MakePalette() //参照《VC++6.0》
{
m_pPalette=(RGBQUAD *)&BitMapInfo; //读调色板
int m_nPaletteEntries=256;
if(m_Palette.GetSafeHandle()!=NULL)
m_Palette.DeleteObject();
if(m_nPaletteEntries!=0)
{
LOGPALETTE *pLogPal=(LOGPALETTE *)new char[sizeof(LOGPALETTE)
+m_nPaletteEntries*sizeof(PALETTEENTRY)];
if(pLogPal!=NULL)
{
pLogPal->palVersion=0x300;
pLogPal->palNumEntries=m_nPaletteEntries;
for(int i=0;i<m_nPaletteEntries;i++)
{
pLogPal->palPalEntry[i].peRed=i;
pLogPal->palPalEntry[i].peGreen=i;
pLogPal->palPalEntry[i].peBlue=i;
}
m_Palette.CreatePalette(pLogPal);
delete [] pLogPal;
}
}
}
void CDib::ProcessImage(short nCols, short nRows, unsigned long nFrameSize, BYTE *pData)
{
ImageHeaderMake(nCols,nRows,nFrameSize);
MakePalette();
pDataDib=pData;
}
BYTE *CDib::LoadBMP(const char *pszFilename) //参考《VC++6.0》自己编写
{
CFile cf;
if(!cf.Open(pszFilename,CFile::modeRead)) //打开失败则返回
{
AfxMessageBox("Failed to open file for read.");
return NULL;
}
BYTE *pDib;
unsigned long nDataLength;
nDataLength = cf.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BitMapInfo);
pDib = new BYTE [nDataLength];
BITMAPFILEHEADER BFH;
if(cf.Read(&BFH,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER) //若文件头长度不相符
||BFH.bfType!='MB') //若文件类型不是Bitmap
{ //则清空pDib后返回
delete [] pDib;
return NULL;
}
BITMAPINFOHEADER BIH;
cf.Read(&BIH,sizeof(BITMAPINFOHEADER));
if(BIH.biBitCount!=8)
{
AfxMessageBox("We can only read 8bit bmp image!");
return NULL;
}
nRows=BIH.biHeight;
nCols=BIH.biWidth;
nLength=nDataLength;
nFrameSize=BIH.biSizeImage;
cf.Seek(-sizeof(BITMAPINFOHEADER),SEEK_CUR);
cf.Read(&BitMapInfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
cf.Read(pDib,nDataLength);
return pDib;
}