LPBYTE Fileheader;
LPBYTE Bitmapinfoheader;
LPBYTE Bitmapinfo;
LPBYTE Content;
CBitmap* Showbitmap;
int Width;
int Height;
int Bitcount;
LPBITMAP Lbit;
int m_length;
LPBYTE lpsourcebit;
HBITMAP hbitmap;
HPALETTE Hpalette;
HANDLE hlogpal;
CPalette* palette;
BOOL judgepalette;
HPALETTE CMy666View::CreateOwnPalette(int ,LPBITMAPINFO );
void CMy666View::OnFileOpen() 
{
palette=new CPalette;
Showbitmap=new CBitmap;
CFileDialog filedia(true);
CFile file;
LPBITMAPINFOHEADER Lpbh;
LPBITMAPINFO Lpb;
DWORD length;
lpsourcebit=NULL;
CDC* cli=GetDC();
CDC MemDC;
if (filedia.DoModal()==IDOK)
{
file.Open(filedia.GetPathName(),CFile::modeReadWrite);
length=file.GetLength();
file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
Bitmapinfoheader=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER));
file.Read(Bitmapinfoheader,sizeof(BITMAPINFOHEADER));
Lpbh=(LPBITMAPINFOHEADER)Bitmapinfoheader;
file.SeekToBegin();
file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
Bitmapinfo=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD))*Lpbh->biClrUsed);
    file.Read(Bitmapinfo,sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD))*Lpbh->biClrUsed);
m_length=length-sizeof(BITMAPINFOHEADER)-(sizeof(RGBQUAD))*Lpbh->biClrUsed;
Content=(LPBYTE)malloc(m_length);
file.Read(Content,m_length);
Lpb=(LPBITMAPINFO)Bitmapinfo;
Bitcount=Lpbh->biBitCount;
switch(Bitcount)
{
case 1:
Hpalette=CreateOwnPalette(2,Lpb);
judgepalette=TRUE;
break;
case 4:
Hpalette=CreateOwnPalette(16,Lpb);
judgepalette=TRUE;
break;
case 8:
Hpalette=CreateOwnPalette(256,Lpb);
judgepalette=TRUE;
break;
}
Width=Lpbh->biWidth;
Height=Lpbh->biHeight;
file.Close();
MemDC.CreateCompatibleDC(cli);
hbitmap=CreateDIBSection(MemDC.m_hDC,(BITMAPINFO*)Bitmapinfo,DIB_RGB_COLORS,(void**)&lpsourcebit,NULL,0);
memcpy(lpsourcebit,Content,m_length);
Showbitmap->Attach(hbitmap);
if(judgepalette)
{
palette->Attach(Hpalette);
MemDC.SelectPalette(palette,TRUE);
MemDC.RealizePalette();
}
MemDC.SelectObject(Showbitmap);
cli->BitBlt(0,0,Width,Height,&MemDC,0,0,SRCCOPY);
}
}
HPALETTE CMy666View::CreateOwnPalette(int number,LPBITMAPINFO Bitmap)
{
LPLOGPALETTE lppal;
int num;
num=number;
HPALETTE  hpalette;
hlogpal=GlobalAlloc(GHND,sizeof(LPLOGPALETTE)+sizeof(PALETTEENTRY)*num);
lppal=(LPLOGPALETTE)GlobalLock(hlogpal);
lppal->palVersion=0x300;
lppal->palNumEntries=num;
for(int i=0;i<num;i++)
{
lppal->palPalEntry[i].peBlue=Bitmap->bmiColors[i].rgbBlue;
lppal->palPalEntry[i].peGreen=Bitmap->bmiColors[i].rgbGreen;
lppal->palPalEntry[i].peRed=Bitmap->bmiColors[i].rgbRed;
lppal->palPalEntry[i].peFlags=0;
}
GlobalUnlock(hlogpal);
GlobalFree(hlogpal);
hpalette=CreatePalette(lppal);
return hpalette;

}

解决方案 »

  1.   

    你只需要在
    if (filedia.DoModal()==IDOK)
    {
    file.Open(filedia.GetPathName(),CFile::modeReadWrite);
    length=file.GetLength();
    file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
    Bitmapinfoheader=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER));
    ......
    }
    的:
    length=file.GetLength();
    和:
    file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
    之间加上一个:
    Fileheader=new unsigned char[sizeof(BITMAPFILEHEADER)];
    就可以了 ,即:
    if (filedia.DoModal()==IDOK)
    {
    file.Open(filedia.GetPathName(),CFile::modeReadWrite);
    length=file.GetLength();
    Fileheader=new unsigned char[sizeof(BITMAPFILEHEADER)];
    file.Read(Fileheader,sizeof(BITMAPFILEHEADER));
    Bitmapinfoheader=(LPBYTE)malloc(sizeof(BITMAPINFOHEADER));
    ......
    }一定通过。
      

  2.   

    Fileheader 还没分配内存了 就用上了 肯定会崩溃
      

  3.   

    首先谢谢CinView.不过还有一个问题改后不是所有的BMP文件都能打开能打开的图象也都变形了是怎么会事呀?
      

  4.   

    还有24位图你好象没处理。还有BitCount=0的时候的呢。