下面是主要的两个函数,下面这个读取BMP图象,其中除BITMAPFILEHEADER外的内容都将读入内存中。返回的是一个句柄。第2个是每次打开一个文档调用的函数。问题是:现在我想当我打开多张图片的时候,怎么把每张的图片数据都分别保存起来呢???也就是说怎么把每次打开的图片句柄保存起来,请指教!!谢谢!
HDIB CDibImage::ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
HDIB hDIB;
LPSTR pDIB;
DWORD dwBitsSize; dwBitsSize = file.GetLength(); // 获取DIB(文件)长度(字节) // 尝试读取DIB文件头
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
{
return NULL;
}
// 判断是否是DIB对象,检查头两个字节是否是"BM"
if (bmfHeader.bfType != DIB_HEADER_MARKER)
{
return NULL;
}
// 为DIB分配内存
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
if (hDIB == 0)
{
return NULL;
}

pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) ) // 读象素
{
::GlobalUnlock((HGLOBAL) hDIB);
::GlobalFree((HGLOBAL) hDIB);
return NULL;
} ::GlobalUnlock((HGLOBAL) hDIB);
return hDIB;
}

解决方案 »

  1.   

    BOOL CDIBDisplayDoc::OnOpenDocument(LPCTSTR lpszPathName) 
    {
    CFile file;
    CFileException fe; if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
    {
    ReportSaveLoadException(lpszPathName, &fe,FALSE, 
    AFX_IDP_FAILED_TO_OPEN_DOC); return FALSE;
    }

    DeleteContents(); BeginWaitCursor(); if(m_pDibImage != NULL)
    {
    delete m_pDibImage;
    m_pDibImage = NULL;
    }
    m_pDibImage = new CDibImage; TRY
    {
    m_hDIB = m_pDibImage->ReadDIBFile(file);
    }
    CATCH (CFileException, eLoad)
    {
    file.Abort();
    EndWaitCursor(); ReportSaveLoadException(lpszPathName, eLoad,FALSE, 
    AFX_IDP_FAILED_TO_OPEN_DOC);

    m_hDIB = NULL; if(m_pDibImage != NULL)
    {
    delete m_pDibImage;
    m_pDibImage = NULL;
    } return FALSE;
    }
    END_CATCH InitDIBData();
    EndWaitCursor();

    // 判断读取文件是否成功
    if (m_hDIB == NULL)
    {
    CString strMsg;
    strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
    MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK); if(m_pDibImage != NULL)
    {
    delete m_pDibImage;
    m_pDibImage = NULL;
    }

    return FALSE;
    }

    SetPathName(lpszPathName); // 设置文件名称
    SetModifiedFlag(FALSE); // 初始化胀标记为FALSE return TRUE;
    }
      

  2.   

    那就在C...Doc::Serilize()里面调用CDibImage::ReadDIBFile()就可以了,在C...Doc中声明一个CDibImage变量。
      

  3.   

    大师,能否给个E_MAIL:小弟才学MFC,有很多不明白。我把这个code发给你,给我加一下号码?谢谢了。或者你直接给我整几句吧。因为我现在比较急。
      

  4.   

    那就在C...Doc::Serilize()里面调用CDibImage::ReadDIBFile()就可以了,在C...Doc中声明一个CDibImage变量。回Mackz(在相互)大师,我的程序中没有你所说的这个函数啊!!!
      

  5.   

    Mackz(在相互)大师,对不起,刚才查了一下,是serialize()序列化,我想请教一下在这个里面怎么来实现呢???
      

  6.   

    http://download.csdn.net/source/172443这里有代码
      

  7.   

    是我打错了……
    你这个CDibImage类我没看到具体代码,不过一般可以返回位图句柄的吧,所以只要声明一个CDibImage类型的成员变量,需要的时候再使用其句柄好了。当然要保存句柄也未尝不可。
    在CDIBDisplayDoc::Serialize(CArchive &ar)中:
    if (ar.IsLoading())
    {
       //CDibImage m_dib;在类头文件中声明
       m_dib.ReadDIBFile(*(ar.GetFile()));
    }
      

  8.   

    如果有问题可以把代码发给我,改完我给你发回去,
    [email protected]