我用File::read()函数获取位图文件的信息,调用CreateDIBitmap()创建位图,为什么显示的图片只有黑白两色??代码如下,希望各位帮帮忙看看什么事?bool CpshopView::LoadBmpFile(CString BmpFileName)
{
CFile hf;
CFileException e;
LPBITMAPINFOHEADER lpImgData;
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
CPaintDC dc(this);
DWORD ImgSize;
DWORD LineBytes;
DWORD i;
DWORD NumColors;
if(!hf.Open(BmpFileName,CFile::modeRead,&e))
{
MessageBox("File c\\not find!","error message",MB_OK);
return false;
}
hf.Read(&bf,sizeof(BITMAPFILEHEADER));
hf.Seek(14,CFile::begin);
hf.Read(&bi,sizeof(BITMAPINFOHEADER));
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
ImgSize=(DWORD)LineBytes*bi.biHeight;
if(bi.biClrUsed!=0)
NumColors=(DWORD)bi.biClrUsed;
else
switch(bi.biBitCount)
{
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
default:
MessageBox("error","error",MB_OK);
return false;
}

if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)))
{
MessageBox("biterror","biterror",MB_OK);
hf.Close();
return false;
}

bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{

MessageBox("MEMerror","MEMerror",MB_OK);
hf.Close();
return false;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
hf.Seek(14,CFile::begin);
hf.Read(lpImgData,(long)sizeof(BITMAPINFOHEADER)+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
hf.Close();
if(NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));
pPal=(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries=NumColors;
pPal->palVersion=0x300;
lpRGB=(LPRGBQUAD)((LPSTR)lpImgData+(DWORD)sizeof(BITMAPINFOHEADER));
for(i=0;i<NumColors;i++)
{
             pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;
    pPal->palPalEntry[i].peRed=lpRGB->rgbRed;
    pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;
    pPal->palPalEntry[i].peFlags=(BYTE)0;
    lpRGB++;
}
hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=::CreateCompatibleDC(dc.m_hDC);
if(hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,false);
dc.RealizePalette();
}
hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);


if(hPalette&&hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,false);
dc.RealizePalette();
}
//ReleaseDC(hDc);
GlobalUnlock(hImgData);
return TRUE;
}

解决方案 »

  1.   

    HBITMAP CreateDIBitmap(
      HDC hdc,                  // handle to device context
      CONST BITMAPINFOHEADER *lpbmih,  // pointer to bitmap size and
                                       // format data
      DWORD fdwInit,            // initialization flag
      CONST VOID *lpbInit,      // pointer to initialization data
      CONST BITMAPINFO *lpbmi,  // pointer to bitmap color-format data
      UINT fuUsage              // color-data usage
    );
     你的参数是否正确?
      

  2.   

    不太喜歡用CreateDIBitmap,比較喜歡用SetDibBits.
      

  3.   

    hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);改為:
    hBitmap=CreateDIBitmap(dc.m_hDC,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
    hDc改為dc.m_hDC.對不對?
      

  4.   

    在vckbase上找一个dib类,然后和你的对一下。
    没时间看你的代码。赫赫