void CDemoBitmapView::OnDraw(CDC* pDC)
{
CDemoBitmapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
HDC hdc=pDC->Detach();
int FHandle;
BITMAPFILEHEADER bmpfh;
HANDLE hBmp, hBuff;
BITMAPINFO *BmpInfo;
unsigned char *Buff;
int Count,NumColor;
long n, BytesPerLine;
unsigned long width,height,numByte;
char *hexName="SaveFile.hex";
FILE *fr;
//Lay kich thuoc, chieu rong va chieu cao cua anh Bitmap
if ((fr=fopen(hexName,"rb"))==NULL)
exit(1);
fread(&width,4,1,fr);
fread(&height,4,1,fr);
numByte=0;
unsigned char temp;
while (!feof(fr))
{
fread(&temp,1,1,fr);
numByte++;
}
fclose(fr);
Count=0;
SetCursor(LoadCursor(NULL, IDC_WAIT));
// Mo file bitmap de doc
if ((FHandle=open(hexName, O_BINARY|O_RDONLY))==-1)
exit(1);
//Doc thong tin cho phan Header
bmpfh.bfType=19778;
bmpfh.bfSize=54+numByte;
bmpfh.bfReserved1=0;
bmpfh.bfReserved2=0;
bmpfh.bfOffBits=54;
// Ðoc header file bitmap
hBmp=GlobalAlloc(LMEM_MOVEABLE,
bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER));
BmpInfo=(BITMAPINFO*)GlobalLock(hBmp);
//doc thong tin cho phan Header Info
BmpInfo->bmiHeader.biSize=40;
BmpInfo->bmiHeader.biWidth=width;
BmpInfo->bmiHeader.biHeight=height;
BmpInfo->bmiHeader.biPlanes=1;
BmpInfo->bmiHeader.biBitCount=1;
BmpInfo->bmiHeader.biCompression=BI_RGB;
BmpInfo->bmiHeader.biSizeImage=numByte;
BmpInfo->bmiHeader.biXPelsPerMeter=0;
BmpInfo->bmiHeader.biYPelsPerMeter=0;
BmpInfo->bmiHeader.biClrUsed=0;
BmpInfo->bmiHeader.biClrImportant=0;
BmpInfo->bmiColors[0].rgbBlue=255;
BmpInfo->bmiColors[0].rgbGreen=255;
BmpInfo->bmiColors[0].rgbRed=255;
BmpInfo->bmiColors[1].rgbBlue=0;
BmpInfo->bmiColors[1].rgbGreen=0;
BmpInfo->bmiColors[1].rgbRed=0;
// Ðoc phan bitmap info và palette màu
if (BmpInfo->bmiHeader.biCompression != BI_RGB)
exit(1);
// Xác dinh so màu cua palette
NumColor=(int)pow(2,BmpInfo->bmiHeader.biBitCount);
if(NumColor>256)
exit(1);
// Xác dinh so byte cho 1 scanline
BytesPerLine=(bmpfh.bfSize-bmpfh.bfOffBits)/BmpInfo->bmiHeader.biHeight;
/* Cap nhat thông tin kích thuoc anh trên BITMAPINFO (hien tai = 0 neu anh không nén) */
BmpInfo->bmiHeader.biSizeImage=bmpfh.bfSize-bmpfh.bfOffBits;
// Ðoc noi dung file bitmap
hBuff=GlobalAlloc(GMEM_MOVEABLE, BmpInfo->bmiHeader.biSizeImage);
Buff=(unsigned char *)GlobalLock(hBuff);
if (!Buff)
exit(1);
//Doc bo 8 byte dau cua hexName.hex
unsigned long stemp;
read(FHandle,&stemp,4);
read(FHandle,&stemp,4);
// Ðoc tung dòng trên file
do
{
n=read(FHandle,Buff,BytesPerLine);
Buff+=n;
Count++;
}while (Count<BmpInfo->bmiHeader.biHeight);
close(FHandle);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
/*-----------------Tao palette màu cho anh Bitmap---------------------*/
HANDLE hMemPal;
LOGPALETTE far *logPal;
HPALETTE hPal;
int i;
hMemPal=GlobalAlloc(LMEM_MOVEABLE,
sizeof(LOGPALETTE)+NumColor*sizeof(PALETTEENTRY));
logPal=(LOGPALETTE far *)GlobalLock(hMemPal);
// So muc trong Palette
logPal->palNumEntries=NumColor;
logPal->palVersion=0x300;
//Gán các giá tri màu RGB cho nhung Entry trong Palette
for (i=0;i<NumColor;i++) //Error here
{
logPal->palPalEntry[i].peRed=BmpInfo->bmiColors[i].rgbRed;
logPal->palPalEntry[i].peGreen=BmpInfo->bmiColors[i].rgbGreen;
logPal->palPalEntry[i].peBlue =BmpInfo->bmiColors[i].rgbBlue;
logPal->palPalEntry[i].peFlags = PC_RESERVED;
}
// Tao handle cho Palette
hPal=CreatePalette(logPal);
GlobalUnlock(hMemPal);
GlobalFree(hMemPal);
if (!hPal)
exit(1);
/*------------------------Tao handle bmp file ------------------------------*/
SetCursor(LoadCursor(NULL, IDC_WAIT));
// Nap palette vào hdc
SelectPalette(hdc,hPal,FALSE);
RealizePalette(hdc);
BmpInfo=(BITMAPINFO *)LocalLock(hBmp);
Buff=(unsigned char *)GlobalLock(hBuff);
//Tao bitmap
hBmp=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)BmpInfo,
CBM_INIT, Buff, (BITMAPINFO *)BmpInfo,DIB_RGB_COLORS);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
GlobalFree(hBuff);
GlobalFree(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
if(!hBmp)
exit(1);
/*-----------------------Hien thi bitmap lên cua so---------------------------*/
HDC hMemDC;
HANDLE OldBmp;
// Tao MDC
hMemDC=CreateCompatibleDC(hdc);
SelectPalette(hMemDC, hPal, FALSE);
// Tro ve palette he thong
UnrealizeObject(hPal);
// Nap lai palette
RealizePalette(hdc);
SelectPalette(hMemDC, hPal, FALSE);
// Liên ket hMemDC voi anh bitmap
OldBmp=SelectObject(hMemDC, hBmp);
// Copy bitmap lên window
BitBlt(hdc,1, 1, width, height, hMemDC, 0, 0,SRCCOPY);
// Huy MDC
SelectObject(hMemDC,OldBmp);
DeleteDC(hMemDC);
}