HBITMAP m_hBitmap;
//读取图像字段的实际大小
long lDataSize = m_pRecordset->GetFields()->GetItem("Pic")->ActualSize;
char *m_pBuffer;  //定义缓冲变量
if(lDataSize > 0)
{
//从图像字段中读取数据到varBLOB中
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("Pic")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBuffer = new char[lDataSize+1]) //分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBuffer,pBuf,lDataSize); //复制数据到缓冲区m_pBuffer
SafeArrayUnaccessData (varBLOB.parray);

//将数据转换为HBITMAP格式
LPSTR hDIB;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;  //用于保存BMP文件头信息,包括类型、大小、位移量等
DWORD bmfHeaderLen;  //保存文件头的长度
bmfHeaderLen = sizeof(bmfHeader);  //读取文件头的长度
//将m_pBuffer中文件头复制到bmfHeader中
strncpy((LPSTR)&bmfHeader, (LPSTR)m_pBuffer, bmfHeaderLen); 
if (bmfHeader.bfType != (*(WORD*)"BM"))   //如果文件类型不对,则返回
{
MessageBox("BMP文件格式不准确");
return;
} hDIB = m_pBuffer + bmfHeaderLen;  //将指针移至文件头后面
//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFOHEADER对象
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFO对象
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
//根据bfOffBits属性将指针移至文件头后
lpDIBBits = (m_pBuffer) + ((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(this);  //生成一个与当前窗口相关的CClientDC,用于管理输出设置
//生成DIBitmap数据
m_hBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
}
}
}
if(m_hBitmap != NULL)
{
CDC* pDC = m_picture.GetDC();
CRect r;
m_picture.GetClientRect(&r);
//将位图选进设备场景中
CDC memdc;
memdc.CreateCompatibleDC( pDC );
memdc.SelectObject(m_hBitmap);
BITMAP bmp;
GetObject(m_hBitmap,sizeof(bmp),&bmp);
pDC->StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
bmp.bmWidth,bmp.bmHeight,SRCCOPY);
memdc.DeleteDC();

}
从ACCESS 用ADO 提取BMP 显示在m_picture上的功能(m_pictuer是picture控件)这段代码 肯定没有问题  放在一个BUTTON上就好使但是问题是  我把这个放到OnInitialUpdate() 之后   死活不出图放到OnPaint() 和 OnDraw()之后结果是  图闪一下 就没了我就是想CVIEW  一初始化   就显示m_picture要怎么改啊…… 

解决方案 »

  1.   

    数据读取的时候只做一次操作
    画图部份放在OnDraw里面就好了
      

  2.   


    HBITMAP m_hBitmap;
    这个设成类成员然后
    if(m_hBitmap != NULL)
    {
    CDC* pDC = m_picture.GetDC();
    CRect r;
    m_picture.GetClientRect(&r);
    //将位图选进设备场景中
    CDC memdc; 
    memdc.CreateCompatibleDC( pDC );
    memdc.SelectObject(m_hBitmap);
    BITMAP bmp;
    GetObject(m_hBitmap,sizeof(bmp),&bmp);
    pDC->StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY); 
    memdc.DeleteDC();}这部分都搬到  ONDRAW()  
    没反应啊……