用C++遍历文件夹连续显示的时候,按了控件之后直接显示最后一幅图像,这有可能是什么原因吗?

用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 或者视频显示,这样就会以播放模式显示了
如果你愿意的话,也可以自己模拟播放过程,不过时间可能很长