小弟这段代码能可以遍历文件夹下所有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函数
我测试过,单幅图片能正常打开并显示,下面是我的源码,求高手解答,谢谢了~~
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函数
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货