下面的代码能正确显示图像的区域,只是区域内都是黑的,但是通过UltraEdit检查pvBits、pvBmi的内容,发现没有问题,请高手赐教!
int Csdoc2View::CreatePalette(FILE* fpDib,int& nColors)
{

fseek(fpDib,sizeof(BITMAPFILEHEADER),SEEK_SET);//定位到有效数据 BitMapInfoHeader bmih;
fread((void*)&bmih,sizeof(BITMAPINFOHEADER),1,fpDib); if(bmih.biBitCount>8)
nColors=0;
else if(bmih.biClrUsed>0)
nColors=bmih.biClrUsed;
else
nColors=1<<bmih.biBitCount;

if(nColors==0)
return 0;
void* pvLogPal=NULL;
LOGPALETTE* pLogPal; pvLogPal=malloc( sizeof(LOGPALETTE)+(nColors-1)*sizeof(PALETTEENTRY) );
if(pvLogPal==NULL)
return 0;
pLogPal=(LOGPALETTE*)pvLogPal; pLogPal->palNumEntries=nColors;
pLogPal->palVersion=0x300;
if( fread( (void*)(pLogPal->palPalEntry),sizeof(PALETTEENTRY),nColors,fpDib)!=nColors )
return 0;
if(m_pPal!=NULL)
delete m_pPal; m_pPal=new CPalette; if(!m_pPal->CreatePalette(pLogPal))
return false; free(pvLogPal);
return 1;
}int Csdoc2View::PaintDIB(char* sName,CDC*& pDC)
{
FILE* fpDib;
if( !ReadDIB(sName,fpDib) )
return 0;
HDC hdc=pDC->GetSafeHdc();
::SetStretchBltMode(hdc,COLORONCOLOR); fseek(fpDib,sizeof(BITMAPFILEHEADER),SEEK_SET);//定位到有效数据 //预读
BitMapInfoHeader bmih;
fread((void*)&bmih,sizeof(BITMAPINFOHEADER),1,fpDib); HPALETTE hOldPal=NULL,hPal=NULL;
int nColors;
int bHavePal=CreatePalette(fpDib,nColors); if(bHavePal)//有调色板
{
hPal=(HPALETTE)m_pPal->m_hObject;
hOldPal=::SelectPalette(hdc,hPal,TRUE);
} int XDest=0,YDest=0,nDestWidth=bmih.biWidth,nDestHeight=bmih.biHeight; 
int XSrc=0,YSrc=0,nSrcWidth=bmih.biWidth,nSrcHeight=bmih.biHeight;

void* pvBmi=malloc( sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD) );
fseek(fpDib,sizeof(BITMAPFILEHEADER),SEEK_SET);//定位到有效数据
fread(pvBmi,sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD),1,fpDib);

void* pvBits=NULL;
int nWid;
if(bHavePal)
nWid=bmih.biWidth;
else
nWid=bmih.biWidth*3;
while(nWid%4)
nWid++;

int i,j;
i=ftell(fpDib);
fseek(fpDib,0,SEEK_END);
j=ftell(fpDib);
fseek(fpDib,i,SEEK_SET);
//pvBits=malloc(nWid*bmih.biHeight);
//fread(pvBits,nWid*bmih.biHeight,1,fpDib);
pvBits=malloc(j-i);
if( pvBits==NULL||fread(pvBits,j-i,1,fpDib)!=1 )
return 0; UINT iUsage;
if(bHavePal)
iUsage=DIB_PAL_COLORS;
else
iUsage=DIB_RGB_COLORS;
DWORD dwRop=SRCCOPY; unsigned char* uc=NULL;
//uc=(unsigned char*)pvBmi;
//for(int i=0;i<sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD);i++) /*uc=(unsigned char*)pvBits;
for(int k=0;k<1154;k++)
{
if(k%10==0)
TRACE("\n");
TRACE("%d ",*uc);
uc++;
}*/
StretchDIBits(hdc,
XDest,YDest,nDestWidth,nDestHeight,
XSrc,YSrc,nSrcWidth,nSrcHeight,
pvBits,
(BITMAPINFO*)pvBmi,
iUsage,
dwRop);
/*if(hOldPal!=NULL)
{
::SelectPalette(hdc,hOldPal,TRUE);
}*/
free(pvBmi);
free(pvBits);
return 1;
}
-------OnDraw----------
PaintDIB(".\\res\\compat.bmp",pDC);