📄 filescan.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 + -