用C++遍历文件夹连续显示的时候,通过控件来控制的,但是按了控件之后直接显示最后一幅图像,这有可能是什么原因吗?求各位大神给给建议,实在是搞不懂
可能是你循环的时候没有每次分配新的内存,导致循环来循环去,图片都加载到同一个位图对象中,所以后面的把前面的冲了。
最好给出相关的代码
如果是Windows平台,我怀疑是你是在主线程中遍历文件夹,按下控件,消息处理完毕界面才会有反应,因此只显示了最后一幅图像
正确的做法应该是把遍历和显示的工作放在单独的线程当中,按下控件仅仅是一个启动线程的功能
void CbianliDoc::OnProcessing()
{
CString str;
str="D:\石英提取图像";
ProcPicDir(str);
}
void CbianliDoc::ProcPicDir(CString strPicDir)
{
CFileFind fileFinder;
if (strPicDir.Right(1) == TEXT("\\"))
{
int nPos = strPicDir.ReverseFind(TEXT('\\'));
strPicDir = strPicDir.Left(nPos);
}
CString strPicFile = TEXT("");
strPicFile.Format(TEXT("%s\\%s"),strPicDir,TEXT("*.bmp"));
BOOL bWorking = fileFinder.FindFile(strPicFile);
while (bWorking)
{
/* if (MessageBox(NULL, "重新打开图像将丢失所有改动!是否继续?", "系统提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
{
// 用户取消操作,直接返回
return;
}
*/
bWorking = fileFinder.FindNextFile();
if (fileFinder.IsDots())
{
continue;
}
CString strFilePath = fileFinder.GetFilePath();
if (fileFinder.IsDirectory())
{
//继续遍历目录
ProcPicDir(strFilePath);
}
else
{
int nPos = strFilePath.ReverseFind(TEXT('.'));
CString strExt = strFilePath.Right(strFilePath.GetLength() - nPos - 1);
if (strExt.CompareNoCase(TEXT("bmp")) == 0)
{
CFile file;
CFileException fe;
// 重新打开文件
if (!file.Open(strFilePath, CFile::modeRead | CFile::shareDenyRead, &fe))
{
// 失败
ReportSaveLoadException(strFilePath, &fe,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 尝试调用ReadDIBFile()读取图像
TRY
{
m_hDIB = ::ReadDIBFile(file);
}
CATCH (CFileException, eLoad)
{
// 读取失败
file.Abort();
// 恢复光标形状
EndWaitCursor();
// 报告失败
ReportSaveLoadException(strFilePath, eLoad,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 设置DIB为空
m_hDIB = NULL;
// 返回
return;
}
END_CATCH
// 初始化DIB
InitDIBData();
// 判断读取文件是否成功
if (m_hDIB == NULL)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 恢复光标形状
EndWaitCursor();
// 返回
return;
}
// 初始化胀标记为FALSE
SetModifiedFlag(FALSE);
// 刷新
UpdateAllViews(NULL);
// 恢复光标形状
EndWaitCursor();
}
}
}
fileFinder.Close();
}
后面的图像直接把前面的图像覆盖了。
显示的太快了导致你只能看到结束的那张,你可以在每显示一张sleep一段时间,这样就可以看出所有图片的显示了
用缩略图,显示所有文件,用 大的界面显示在结束的时候,显示其中某一幅图形
大的图像,不适合连续显示,因为可能看不到或者只能显示最后一幅
需要连续的话, 制作成 gif 或者视频显示,这样就会以播放模式显示了
如果你愿意的话,也可以自己模拟播放过程,不过时间可能很长