读书人

VC界面里读取ACCESS中的图片。Buffer转

发布时间: 2012-12-17 09:31:40 作者: rapoo

VC界面里读取ACCESS中的图片。。。Buffer转成HBITMAP格式时出现的问题
本帖最后由 just0307 于 2012-07-22 17:20:49 编辑 我将ACCESS数据库里存储的BMP位图读取到字符数组m_pBMPBuffer,然后再用写的BufferToHBITMAP()函数转成HBITMAP

现在出现的问题是:if(bmfHeader.bfType != (*(WORD*)"BM"))
return NULL;
在这句显示读取的不是位图,按道理bmfHeader.bfType应该等于BM的
但是我单步执行查到m_pBMPBuffer里其实存在着“BM”如截图所示!!!




以下是主要代码,求高人指点啊!为什么会bmfHeader.bfType不是"BM"呢???

void detail_dlg::ReadPicture()
{


//设置查询字符串
_bstr_t bstrSQL_detail;
bstrSQL_detail =(_bstr_t)SQL_detail;
MessageBox(bstrSQL_detail);
m_pRecordset_detail.CreateInstance(__uuidof(Recordset));//该句也可以使用
// m_pRecordset.CreateInstance(“ADODB.Recordset”);代替
//打开记录集
m_pRecordset_detail->Open((_bstr_t)bstrSQL_detail,m_pConnection_detail.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
//DestroyPhoto ();
//用于去掉上一条记录的照片

long lDataSize = m_pRecordset_detail->GetFields()->GetItem ("产品图片")->ActualSize;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset_detail->GetFields() ->GetItem("产品图片")->GetChunk(lDataSize);
if (varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBMPBuffer = new char [lDataSize+1])
//重新分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData (varBLOB.parray, (void **)&pBuf);
memcpy (m_pBMPBuffer,pBuf,lDataSize);
//复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
m_nFileLen = lDataSize;
m_hPhotoBitmap = BufferToHBITMAP();
}
}
}

CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC_PIC);//控件ID
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pStatic->SetBitmap(m_hPhotoBitmap);

//m_b.EnableWindow() ;
UpdateData(false) ;
//Invalidate();
}



HBITMAP detail_dlg::BufferToHBITMAP()
{ //缓冲到BMP
HBITMAP hBmp;
LPSTR hDIB;
LPSTR lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;
bmfHeaderLen = sizeof (bmfHeader) ;
strncpy ((LPSTR) &bmfHeader,(LPSTR) m_pBMPBuffer,bmfHeaderLen);
//memcpy((void *)&bmfHeader,(const void *)lpBuffer, bmfHeaderLen);
if(bmfHeader.bfType != (*(WORD*)"BM"))
return NULL;

hDIB = lpBuffer + bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader= *(LPBITMAPINFOHEADER) hDIB ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO) hDIB ;
lpDIBBits = (lpBuffer)+((BITMAPFILEHEADER*)lpBuffer)->bfOffBits;
CClientDC dc(this);
hBmp=CreateDIBitmap (dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
return hBmp;
}

[最优解释]
可以调试时查看一些 m_pBMPBuffer的值,是424d('B''M')开头吗?不是的话那这个值就错了。

(*(WORD*)"BM")改成(*(WORD*)('m' << 8)
[其他解释]
求指点啊

读书人网 >VC/MFC

热点推荐