小弟这段代码能可以遍历文件夹下所有jpg图片(测试过记录文件夹下所有图片名称,应该没什么问题),但是在循环显示图片的过程中,出现了问题,只能正常显示遍历的最后一幅图片,前面均显示不出来。
我测试过,单幅图片能正常打开并显示,下面是我的源码,求高手解答,谢谢了~~
void CMyDlg::OnOpen() 
{
CFileDialog dlg(TRUE);
CString dirname;
if (dlg.DoModal() == IDOK)
{
dirname = m_pathname.Left(dlg.GetPathName().GetLength() - dlg.GetFileName().GetLength() -1);
}
Search(dirname);
}
void CMyDlg::Search(CString dir) //遍历文件夹并调用加载图片函数
{
CFileFind  finder;
if (dir.Right(1) != "\\")
     dir += "\\";
BOOL bWorking = finder.FindFile(dir + "*.jpg");
if(!bWorking)
return;
CString str;
while (bWorking)
{
bWorking = finder.FindNextFile();
if(finder.IsDirectory()|| finder.IsDots() || finder.IsHidden())
      continue;
else
{
     str= finder.GetFilePath();
     LoadJPGFile(str);
     str.Empty();
     nvalidate();
}
}
finder.Close();
}
BOOL CMyDlg::LoadJPGFile(const char *pPathname)
{
CFile file;
if( !file.Open( pPathname, CFile::modeRead))
return FALSE; DWORD m_nFileLen;
m_nFileLen = file.GetLength(); HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );
LPVOID lpBuf = ::GlobalLock( hMem );
if( file.ReadHuge( lpBuf, m_nFileLen ) != m_nFileLen )
return FALSE;
file.Close(); ::GlobalUnlock( hMem ); if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK ) 
return FALSE;

if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK )
return FALSE;

return TRUE;
}void CMyDlg::DrawImage(int x, int y, CDC *pDC)
{
if (pPicture != NULL) 
{
long nWidth,nHeight;  
pPicture->get_Width( &nWidth );   
pPicture->get_Height( &nHeight ); 
//按窗口尺寸显示
CRect rect;
GetClientRect(&rect);
pPicture->Render(pDC->m_hDC,x,y,rect.Width(),rect.Height(),0,nHeight,nWidth,-nHeight,NULL);
}
}
在OnPaint函数中,调用了DrawImage函数

解决方案 »

  1.   

    在线程中处理,遍历得到图片的路径,然后SendMessage()发送自定义的消息到主界面,主界面处理,然后显示
      

  2.   

    OnPaint只在窗口发生变化时才发生重绘。我估计你在载入过程中并未触发重绘。你可以在OnPaint里输出信息看看,如果是这样的话就在遍历过程中调用你的绘制函数进行绘制吧。
      

  3.   

    这个问题,在主线程中循环显示图片,只有循环结束后主窗口才会响应重绘的,肯定只能显示最后一张,可以强制在循环中读取到一幅图片后发消息给窗口,窗口再控制显示,而自身循环中调用 peekmessage translatemsg dispatch..来强制消息循环进行