下面是我编写的一段程序
void CDisplayBmpDlg::OnShowImage()
{
CImageData db;//定义记录集对象:此类是从CRecordset类继承一来的,只做了ODBC源,和一个成员变量CLongBinary m_images,其中m_images已经将位图数据存下了。
db.Open();
GetImageData(db.m_images); CPaintDC dc(this);
if (!(Bitmap.m_hObject == NULL))
{ CDC dcMem; 
dcMem.CreateCompatibleDC( &dc ); //create a Memory Image
CBitmap* pbmpOld ;
BITMAP BmpSize ; 
Bitmap.GetBitmap(&BmpSize);//get Image Size
pbmpOld = dcMem.SelectObject(&Bitmap);
dc.StretchBlt( 20, 20, 200, 200, &dcMem, 0, 0, BmpSize.bmWidth, BmpSize.bmHeight, SRCCOPY);
dcMem.SelectObject( pbmpOld ); 
}
}BOOL CDisplayBmpDlg::GetImageData(CLongBinary &Dbbin)
{
LPBITMAPINFOHEADER  pImgData_Header;
LPBITMAPINFO pImgData_Info;
pImgData_Header= (LPBITMAPINFOHEADER)GlobalLock(Dbbin.m_hData);
pImgData_Info = (LPBITMAPINFO)GlobalLock(Dbbin.m_hData);

int nColors=pImgData_Header->biClrUsed ? pImgData_Header->biClrUsed : 1 << pImgData_Header->biBitCount;//确定图像的颜色数
LPVOID lpDIBBits;
if( pImgData_Info->bmiHeader.biBitCount > 8 )
lpDIBBits=(LPVOID)((LPDWORD)(pImgData_Info->bmiColors+ pImgData_Info->bmiHeader.biClrUsed)+
(( pImgData_Info->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(pImgData_Info->bmiColors + nColors);//得到图像各个像素的具体数据
CWindowDC dc(this);

HBITMAP hBmp = CreateDIBitmap( dc.m_hDC, 
(LPBITMAPINFOHEADER)pImgData_Header, 
(LONG)CBM_INIT, 
lpDIBBits, 
(LPBITMAPINFO)pImgData_Info, 
DIB_RGB_COLORS);//问题就出在此,由上面的多个参数生成的hBmp这个位图句柄是空的,也就是没有成功。小弟不知是哪里的错误,请多位高手多多帮助,谢谢了。
Bitmap.Attach( hBmp );
return true;
}
如果还有什么地方需要我说明的我会在线说的。谢谢

解决方案 »

  1.   

    首先确定从数据库中获取的数据存在,然后确保位图头信息和位图DIBBits象素 数据正确。
    一般问题出在象素的起始位置上。因为如果位图色深低于16位会有一个2^n的调色板,需要得到正确的偏移。
    调色板项的大小为4个字节,则8位位图调色板大小=256*4;4位=16*4;2位=2×4;
    则位图数据的位置=位图头的大小+调色板大小