⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filescan.cpp

📁 基于EVC开发的图片集文件浏览和图片浏览为一体的程序
💻 CPP
字号:
// FileScan.cpp : implementation file
//

#include "stdafx.h"
#include "PicImg.h"
#include "FileScan.h"
#include "Help.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// FileScan dialog


FileScan::FileScan(CWnd* pParent /*=NULL*/)
	: CDialog(FileScan::IDD, pParent)
{
	iconflag[0] = FALSE;
	iconflag[1] = FALSE;
	iconflag[2] = FALSE;
	iconflag[3] = FALSE;
	iconflag[4] = FALSE;
	iconflag[5] = FALSE;

	//{{AFX_DATA_INIT(FileScan)
	//}}AFX_DATA_INIT
}


void FileScan::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(FileScan)
	DDX_Control(pDX, IDC_FILE_SCAN, m_filelist);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(FileScan, CDialog)
	//{{AFX_MSG_MAP(FileScan)
	ON_NOTIFY(NM_DBLCLK, IDC_FILE_SCAN, OnDblclkFileScan)
	ON_BN_CLICKED(IDC_UPWARD, OnUpward)
	ON_BN_CLICKED(IDC_FORWARD, OnForward)
	ON_BN_CLICKED(IDC_UP, OnUp)
	ON_WM_PAINT()
	ON_WM_LBUTTONUP()
	ON_BN_CLICKED(IDC_HELP, OnHelp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// FileScan message handlers

BOOL FileScan::OnInitDialog() 
{
	CDialog::OnInitDialog();
	// TODO: Add extra initialization here
	this->SetWindowText(_T("ImageViewex"));	
    m_bg_skim.LoadBitmap(IDB_BG_SKIM);
    m_rtlastpage = CRect(561,306,631,356);		// 前一行
	m_rtnextpage = CRect(561,366,631,416);		// 下一行
	m_rtopen = CRect(561,426,631,476);		// 图象打开
	m_rtclose = CRect(590,0,630,30);		// 关闭
	m_rthelp = CRect(540,0,580,30); 
	//对话框设置
	this->SetWindowPos(&wndTop,0,0,640,480,SWP_SHOWWINDOW);
	m_filelist.SetWindowPos(&wndTop,12,43,540,400,SWP_SHOWWINDOW);
    //加载资源.
	bm.LoadBitmap ( IDB_MP3 );
	bm1.LoadBitmap( IDB_BOOK);
	bm2.LoadBitmap ( IDB_PICTURE );
	bm3.LoadBitmap ( IDB_AVI );
	bm4.LoadBitmap ( IDB_WMV );
    bm5.LoadBitmap ( IDB_FILEVIEW );
    LargeImageList.Create ( 32, 32, ILC_COLOR24, 0, 6 );
    LargeImageList.Add ( &bm, RGB(0, 0, 0));
	LargeImageList.Add ( &bm1, RGB(0, 0, 0));
	LargeImageList.Add ( &bm2, RGB(0, 0, 0));
	LargeImageList.Add ( &bm3, RGB(0, 0, 0));
	LargeImageList.Add ( &bm4, RGB(0, 0, 0));
	LargeImageList.Add ( &bm5, RGB(0, 0, 0));

    m_filelist.SetImageList ( &LargeImageList, LVSIL_NORMAL );
	m_filelist.SetIconSpacing(CSize(90, 80));
    m_filelist.SetBkColor( RGB( 190, 210, 240 ) );
	m_filelist.SetTextBkColor( RGB( 190, 210, 240 ) );

	ptnup = (CButton* )this->GetDlgItem(IDC_UPWARD );
	ptnfor = (CButton* )this->GetDlgItem(IDC_FORWARD );
	ptn = (CButton*)this->GetDlgItem(IDC_UP);

	// 初始化数据
	itemperline = 6;	
	lineperpage = 5;
	curline = 0;
	curdir = "\\硬盘\\";
	maxline = GetMaxLine();
	filename = "";

	if (maxline==0)
	{
		// !!!GetMaxLine() = 0 表示没有任何item
		ptnup->EnableWindow(FALSE);
		ptnfor->EnableWindow(FALSE);
		ptn->EnableWindow(FALSE);
	}
	else
		maxline--;

	FileView();//插入所需要的项.
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void FileScan::OnDblclkFileScan(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	POSITION pos = m_filelist.GetFirstSelectedItemPosition();
	if (pos != 0)
	{
		if( mybool[ (int)pos - 1 ] == TRUE )
		{
			curdir = m_StringList[ (int)pos - 1 ] + "\\";  //得到当前目录
			curline = 0;
			maxline = GetMaxLine();		
			
			if (maxline==0)
			{
				// !!!GetMaxLine() = 0 表示没有任何item
				ptnup->EnableWindow(FALSE);
				ptnfor->EnableWindow(FALSE);
				ptn->EnableWindow(FALSE);
			}
			else
				maxline--;

			FileView();
		}
		
		else
		{
			filename = m_StringList[ (int)pos - 1 ]; //播放器路径
			OnOK();
		}
	}
	
	*pResult = 0;
}


void FileScan::OnUpward() 
{
	// TODO: Add your control notification handler code here
	if (curline>0)
	{
		curline--;
		FileView();
	}
	
}

void FileScan::OnForward() 
{
	// TODO: Add your control notification handler code here
	if (curline<=maxline)
	{
		curline++;
		FileView();	
	}
	
}

void FileScan::OnUp() 
{
	// TODO: Add your control notification handler code here
	int i;
    CString stringup;
	if( !GetMaxLine() )
		return;
	else
	{
		stringup = m_StringList[0];
		i = stringup.ReverseFind('\\');
		stringup = stringup.Left( i );
		if( stringup != "\\Storage Card")
		{
			i = stringup.ReverseFind('\\');
			stringup = stringup.Left( i );
			curdir = stringup + "\\";
			curline = 0;
			maxline = GetMaxLine();		
			
			if (maxline==0)
			{
				// !!!GetMaxLine() = 0 表示没有任何item
				ptnup->EnableWindow(FALSE);
				ptnfor->EnableWindow(FALSE);
				ptn->EnableWindow(FALSE);
			}
			else
				maxline--;


			FileView();
		}
		else
		{
			ptn->EnableWindow( FALSE );
		}
	}	
}

void FileScan::splitpath(CString path, CString &ext)
{
	int i;
	CString str1;
	CString str2;
    str1 = path;
	i = str1.ReverseFind('.');
	str2 = str1.Right( str1.GetLength() - i  );
	ext = str2;

}

int FileScan::GetMaxLine()
{
	CString directory;
	CString postfix;
	directory = curdir + "*.*";
	WIN32_FIND_DATA fd;
	int itemcount=0;

	//WIN32_FIND_DATA : receives information about a found file or subdirectory
	//return a search handle;
	HANDLE hFind = FindFirstFile(directory,&fd);

	int a=TRUE;

	while((INVALID_HANDLE_VALUE != hFind) && a)
	{
		if( fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
		{
			if( IsFormat( curdir + fd.cFileName ) == TRUE )
				itemcount++;
		}
		else
		{
			splitpath ( fd.cFileName, postfix );
		    postfix.MakeLower();
		    for( int j=0; j<i; j++ )
			{
				if ( !wcscmp ( postfix, m_format[j] ) )
					itemcount++;
			}				
		}
		a=::FindNextFile(hFind,&fd);
	}
	FindClose(hFind);

	if (itemcount==0)
		return 0;
	else
		return itemcount/itemperline+1;

}

BOOL FileScan::IsFormat(CString formatflag)
{
	CString fullformat;
	CString fixname;
	fullformat = formatflag + "\\*.*";
	WIN32_FIND_DATA fd;
	HANDLE hFind = FindFirstFile(fullformat,&fd);
	int a=TRUE;
	while((hFind != INVALID_HANDLE_VALUE) &&a)
	{
		if( fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
		{
			if(IsFormat( formatflag +"\\"+ fd.cFileName ))
				return TRUE;
		}
		else
		{
			splitpath ( fd.cFileName, fixname );
		    fixname.MakeLower();
			for( int j=0; j<i; j++ )
			{
				CString str = m_format[j];
				if ( !wcscmp ( fixname, m_format[j] ) )
					return TRUE;
			}
		}

		a=::FindNextFile(hFind,&fd); //a是判断是否还有文件.
	}
	FindClose(hFind);
	return FALSE;

}

void FileScan::SetFormat(CString format)
{
	m_format.insert(m_format.end(),format);
	i++;

}

// 根据指定目录填充文件列表
void FileScan::FileView()
{
	// 计算上翻下翻行数
	if (curline<0)
		curline = 0;

	if (curline>maxline)
		curline = maxline;

	// 修改按钮状态
	ptnup->EnableWindow(TRUE);
	ptnfor->EnableWindow(TRUE);
	if (curline == 0)
	{
		// 使下翻按钮有效
		ptnup->EnableWindow(FALSE);
	}
	if (curline > maxline-1)
	{
		// 使上翻按钮有效
		ptnfor->EnableWindow(FALSE);
	}


	ptn->EnableWindow(TRUE);  //使向上按钮有效.	

	// 重画列表框
	m_filelist.DeleteAllItems();	//删除列表框中所有的项.
	m_StringList.clear();			//把上次字符串中加载的文件名去掉.

	int itemno;
	CString directory;
	CString postfix;
	CString FullStr;

	directory = curdir + "*.*";
	int curitem=0;

	WIN32_FIND_DATA fd;
	HANDLE hFind = FindFirstFile(directory,&fd);
	int a=TRUE;

	while( (hFind != INVALID_HANDLE_VALUE) && a)
	{
		if( fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
		{
			if(IsFormat( curdir + fd.cFileName ))
			{
				
				if ((curitem>=curline*itemperline)&& (curitem<(curline+lineperpage)*itemperline))
				{
					if( wcscmp ( fd.cFileName, L"Navigation" ) )
					{
						itemno = m_filelist.GetItemCount();
						m_filelist.InsertItem(itemno, fd.cFileName,5);
						mybool[itemno] = TRUE;
						FullStr = curdir + fd.cFileName;
						m_StringList.insert( m_StringList.end(), FullStr );
					}
				}
					
				curitem++;
			}
		}
		else
		{
			splitpath ( fd.cFileName, postfix );
		    postfix.MakeLower();
			for( int j=0; j<i; j++ )
			{
				if ( !wcscmp ( postfix, m_format[j] ) )
				{
					if( iconflag[0] == TRUE )          //判断对应的位图是否是所需要的.
					{
						if ((curitem>=curline*itemperline)&& (curitem<(curline+lineperpage)*itemperline))
						{
							itemno = m_filelist.GetItemCount();
							m_filelist.InsertItem(itemno, fd.cFileName,0);
							mybool[itemno] = FALSE;
			//				document = curdir;
							FullStr = curdir + fd.cFileName;
							m_StringList.insert( m_StringList.end(), FullStr );
						}
						curitem++;

					}
					if( iconflag[1] == TRUE )
					{
						if ((curitem>=curline*itemperline)&& (curitem<(curline+lineperpage)*itemperline))
						{
							itemno = m_filelist.GetItemCount();
							m_filelist.InsertItem(itemno, fd.cFileName,1);
							mybool[itemno] = FALSE;
			//				document = curdir;
							FullStr = curdir + fd.cFileName;
							m_StringList.insert( m_StringList.end(), FullStr );
						}
						curitem++;

					}
					if( iconflag[2] == TRUE )
					{
						if ((curitem>=curline*itemperline)&& (curitem<(curline+lineperpage)*itemperline))
						{
							itemno = m_filelist.GetItemCount();
							m_filelist.InsertItem(itemno, fd.cFileName,2);
							mybool[itemno] = FALSE;
			//				document = curdir;
							FullStr = curdir + fd.cFileName;
							m_StringList.insert( m_StringList.end(), FullStr );
						}
						curitem++;

					}
					if( iconflag[3] == TRUE ) // 在这里决定视频只用一种.  
					{
						if ((curitem>=curline*itemperline)&& (curitem<(curline+lineperpage)*itemperline))
						{
							itemno = m_filelist.GetItemCount();
							m_filelist.InsertItem(itemno, fd.cFileName,3);
							mybool[itemno] = FALSE;
			//				document = curdir;
							FullStr = curdir + fd.cFileName;
							m_StringList.insert( m_StringList.end(), FullStr );
						}
						curitem++;

					}
					if( iconflag[4] == TRUE )  //第五种待定.
					{
						if ((curitem>=curline*itemperline)&& (curitem<(curline+lineperpage)*itemperline))
						{
							itemno = m_filelist.GetItemCount();
							m_filelist.InsertItem(itemno, fd.cFileName,4);
							mybool[itemno] = FALSE;
			//				document = curdir;
							FullStr = curdir + fd.cFileName;
							m_StringList.insert( m_StringList.end(), FullStr );
						}
						curitem++;

					}
				}
			}				
		}
		a=::FindNextFile(hFind,&fd);
	}
	FindClose(hFind);

}


FileScan::~FileScan()
{
//	delete ptnup;
//	delete ptnfor;
//	delete ptn;
//	delete pBtn;
}

void FileScan::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CDC memdc;
	memdc.CreateCompatibleDC(&dc);
	memdc.SelectObject(m_bg_skim);
	dc.BitBlt(0,0,640,480,&memdc,0,0,SRCCOPY);
	memdc.DeleteDC();
	// Do not call CDialog::OnPaint() for painting messages
}

BOOL FileScan::InRect(int left, int top, int right, int bottom, int px, int py)
{
	if((left < 0) || (left > 640))
		return FALSE;
	if((right < 0) || (right > 640))
		return FALSE;
	if((top < 0) || (top > 480))
		return FALSE;
	if((bottom < 0) || (bottom > 480))
		return FALSE;
	if((px < 0) || (px > 640))
		return FALSE;
	if((py < 0) || (py > 480))
		return FALSE;

	if((px>=left)&&(px<=right) && (py>=top)&&(py<=bottom))
		return TRUE;
	return FALSE;

}

void FileScan::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(InRect(m_rtlastpage.left,m_rtlastpage.top,m_rtlastpage.right,m_rtlastpage.bottom,point.x,point.y))
		OnUpward();
	if(InRect(m_rtnextpage.left,m_rtnextpage.top,m_rtnextpage.right,m_rtnextpage.bottom,point.x,point.y))
		OnForward();
	if(InRect(m_rtopen.left,m_rtopen.top,m_rtopen.right,m_rtopen.bottom,point.x,point.y))
		OnUp();
	if(InRect(m_rtclose.left,m_rtclose.top,m_rtclose.right,m_rtclose.bottom,point.x,point.y))
		OnCancel();
    if(InRect(m_rthelp.left,m_rthelp.top,m_rthelp.right,m_rthelp.bottom,point.x,point.y))
		OnHelp();

	CDialog::OnLButtonUp(nFlags, point);
}

BOOL FileScan::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if ( pMsg->message == WM_KEYDOWN )
	{
		if( pMsg->wParam == VK_6 )
		{
			HWND hand;
			BOOL proc = FALSE;
			hand = ::FindWindow( NULL,_T("cstgps") );  
			if( hand )
			{
				proc = ::SetForegroundWindow(hand);
			}
			OnOK();
		}
		if( pMsg->wParam == VK_2 )
		{
			OnUp();
		}
		if( pMsg->wParam == VK_1 )
		{
			OnUpward();
		}
		if( pMsg->wParam == VK_3 )
		{
			OnForward();
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

void FileScan::OnHelp() 
{
	// TODO: Add your control notification handler code here
	Help myhelp;
	myhelp.DoModal();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -