下面是主要的两个函数,下面这个读取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;
}
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;
}
{
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;
}
你这个CDibImage类我没看到具体代码,不过一般可以返回位图句柄的吧,所以只要声明一个CDibImage类型的成员变量,需要的时候再使用其句柄好了。当然要保存句柄也未尝不可。
在CDIBDisplayDoc::Serialize(CArchive &ar)中:
if (ar.IsLoading())
{
//CDibImage m_dib;在类头文件中声明
m_dib.ReadDIBFile(*(ar.GetFile()));
}
[email protected]