📄 fileshowview.cpp
字号:
// FileShowView.cpp : implementation of the CFileShowView class
//
#include "stdafx.h"
#include "DriveExplorer.h"
#include "DriveExplorerDoc.h"
#include "FileShowView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static m_bAccend = TRUE;
static int CALLBACK CompareFileNameAscend(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort)
{
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
// CString text1 ;
// CString text2 ;
// int index;
// LVFINDINFO info;
// info.flags = LVFI_PARAM;
//
// info.lParam = lParam1;
// index = pListCtrl->FindItem(&info);
// text1 = pListCtrl->GetItemText(index, 0); //获取前一个文本信息
//
// info.lParam = lParam2;
// index = pListCtrl->FindItem(&info);
// text2 = pListCtrl->GetItemText(index, 0); //获取后一个文本信息
CString text1 = pListCtrl->GetItemText(lParam1, 0);
CString text2 = pListCtrl->GetItemText(lParam2, 0);
//字符串型
if(m_bAccend)
return text1.CompareNoCase(text2);
else
return text2.CompareNoCase(text1);
}
static int CALLBACK CompareFileSize(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort)
{
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
CString text1 = pListCtrl->GetItemText(lParam1, 1);
CString text2 = pListCtrl->GetItemText(lParam2, 1);
DWORD size1, size2;
size1 = size2 = 0;
if(lstrcmp(text1.Right(2), _T("BY")) == 0)
{
size1 = atoi(text1.Left(text1.GetLength() - 2));
}
else if(lstrcmp(text1.Right(2), _T("KB")) == 0)
{
size1 = atoi(text1.Left(text1.GetLength() - 2)) * 1024;
}
else if(lstrcmp(text1.Right(2), _T("MB")) == 0)
{
size1 = atoi(text1.Left(text1.GetLength() - 2)) * 1024 * 1024;
}
if(lstrcmp(text2.Right(2), _T("BY")) == 0)
{
size2 = atoi(text2.Left(text2.GetLength() - 2));
}
else if(lstrcmp(text2.Right(2), _T("KB")) == 0)
{
size2 = atoi(text2.Left(text2.GetLength() - 2)) * 1024;
}
else if(lstrcmp(text2.Right(2), _T("MB")) == 0)
{
size2 = atoi(text2.Left(text2.GetLength() - 2)) * 1024 * 1024;
}
if(m_bAccend)
return size1 - size2;
else
return size2 - size1;
}
/////////////////////////////////////////////////////////////////////////////
// CFileShowView
IMPLEMENT_DYNCREATE(CFileShowView, CListView)
BEGIN_MESSAGE_MAP(CFileShowView, CListView)
//{{AFX_MSG_MAP(CFileShowView)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFileShowView construction/destruction
CFileShowView::CFileShowView()
{
// TODO: add construction code here
m_pImagelist = NULL;
m_plstFileItem = NULL;
//m_bAccend = FALSE;
}
CFileShowView::~CFileShowView()
{
if(NULL != m_pImagelist)
{
for(int i = 0; i < m_pImagelist->GetImageCount(); i++)
{
::DestroyIcon(m_pImagelist->ExtractIcon(i));
}
m_pImagelist->DeleteImageList();
delete m_pImagelist;
m_pImagelist = NULL;
}
if(NULL != m_plstFileItem)
{
for(int i = 0; i < m_plstFileItem->GetSize(); i++)
{
delete (FileItemSt*)m_plstFileItem->GetAt(i);
}
m_plstFileItem->RemoveAll();
delete m_plstFileItem;
m_plstFileItem = NULL;
}
}
BOOL CFileShowView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFileShowView drawing
void CFileShowView::OnDraw(CDC* pDC)
{
CDriveExplorerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CFileShowView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
CListCtrl& ListCtrl = this->GetListCtrl();
CRect rect;
this->GetClientRect(&rect);
long lWndStyle = ::GetWindowLong(this->GetSafeHwnd(), GWL_STYLE);
lWndStyle |= LVS_REPORT | LVS_SINGLESEL;
::SetWindowLong(this->GetSafeHwnd(), GWL_STYLE, lWndStyle);
ListCtrl.InsertColumn(0, _T("名称"), LVCFMT_LEFT | DT_VCENTER, rect.Width() / 4);
ListCtrl.InsertColumn(1, _T("大小"), LVCFMT_RIGHT | DT_VCENTER, rect.Width() / 4);
ListCtrl.InsertColumn(2, _T("类型"), LVCFMT_RIGHT | DT_VCENTER, rect.Width() / 4);
ListCtrl.InsertColumn(3, _T("修改时间"), LVCFMT_LEFT | DT_VCENTER, rect.Width() / 4);
if(NULL == m_pImagelist)
{
m_pImagelist = new CImageList;
}
if(m_pImagelist)
{
m_pImagelist->Create(16, 16, ILC_COLOR8 | ILC_MASK, 0, 1024);
}
HICON HIconTemp = AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_FILEFOLDER));
m_pImagelist->Add(HIconTemp);
ListCtrl.SetImageList(m_pImagelist, LVSIL_SMALL);
if(NULL == m_plstFileItem)
{
m_plstFileItem = new CDWordArray;
}
}
/////////////////////////////////////////////////////////////////////////////
// CFileShowView printing
BOOL CFileShowView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFileShowView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFileShowView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFileShowView diagnostics
#ifdef _DEBUG
void CFileShowView::AssertValid() const
{
CListView::AssertValid();
}
void CFileShowView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CDriveExplorerDoc* CFileShowView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDriveExplorerDoc)));
return (CDriveExplorerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFileShowView message handlers
void CFileShowView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
CString strPath;
strPath = GetDocument()->GetCurParentFilePath();
GetListCtrl().DeleteAllItems();
if(NULL == m_plstFileItem)
return;
for(int i = 0; i < m_plstFileItem->GetSize(); i++)
{
delete (FileItemSt*)m_plstFileItem->GetAt(i);
}
m_plstFileItem->RemoveAll();
for(i = 1; i < m_pImagelist->GetImageCount(); i++)
{
::DestroyIcon(m_pImagelist->ExtractIcon(i));
m_pImagelist->Remove(i);
}
WIN32_FIND_DATA fd;
CString str;
CString strFileName;
str.Format("%s*.*", strPath);
HANDLE handle = FindFirstFile((LPCTSTR)str, &fd);
if(INVALID_HANDLE_VALUE == handle)
return;
do
{
if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
{
}
else
{
if(strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0)
continue;
FileItemSt* pNode = new FileItemSt;
pNode->dwFileSize = 0;
pNode->ftModifyTime = fd.ftLastWriteTime;
pNode->nImageIndex = 0;
strcpy(pNode->szFileName, fd.cFileName);
strcpy(pNode->szTypeName, _T("文件夹"));
m_plstFileItem->Add((DWORD)pNode);
}
}
else
{
if(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
{
}
else
{
strFileName.Format("%s%s", strPath, fd.cFileName);
SHFILEINFO shFi;
HIMAGELIST hIamgeList = (HIMAGELIST)SHGetFileInfo(strFileName, 0, &shFi, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_SMALLICON | SHGFI_TYPENAME);
FileItemSt* pNode = new FileItemSt;
strcpy(pNode->szFileName, fd.cFileName);
strcpy(pNode->szTypeName, shFi.szTypeName);
pNode->ftModifyTime = fd.ftLastWriteTime;
pNode->dwFileSize = (fd.nFileSizeHigh * MAXDWORD) + fd.nFileSizeLow;
pNode->nImageIndex = m_pImagelist->Add(shFi.hIcon);
m_plstFileItem->Add((DWORD)pNode);
}
}
}while( FindNextFile(handle, &fd));
for(i = 0; i < m_plstFileItem->GetSize(); i++)
{
FileItemSt* pNode = (FileItemSt*)m_plstFileItem->GetAt(i);
GetListCtrl().InsertItem(i, pNode->szFileName, pNode->nImageIndex);
GetListCtrl().SetItemData(i, i);
CString strTemp;
if(pNode->dwFileSize == 0)
{
strTemp = "";
}
else if(pNode->dwFileSize < 1024)
{
strTemp.Format("%dBY", pNode->dwFileSize);
}
else if(pNode->dwFileSize >= 1024 && pNode->dwFileSize < 1024 * 1024)
{
if(pNode->dwFileSize % 1024)
{
strTemp.Format("%dKB", pNode->dwFileSize / 1024);
}
else
{
strTemp.Format("%dKB", pNode->dwFileSize / 1024 + 1);
}
}
else
{
strTemp.Format("%dMB", pNode->dwFileSize / 1024 / 1024 + 1);
}
GetListCtrl().SetItemText(i, 1, strTemp);
GetListCtrl().SetItemText(i, 2, pNode->szTypeName);
CTime tm(pNode->ftModifyTime);
strTemp.Format("%d-%d-%d %d:%d", tm.GetYear(), tm.GetMonth(), tm.GetDay(), tm.GetHour(), tm.GetMinute());
GetListCtrl().SetItemText(i, 3, strTemp);
}
}
void CFileShowView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NMLISTVIEW* pLVITem = (NMLISTVIEW*)pNMHDR;
int nIdex = pLVITem->iItem;
if(lstrcmp(GetListCtrl().GetItemText(nIdex, 2), _T("文件夹")) == 0)
{
GetDocument()->SetCurSelFilePathInTreeView(GetListCtrl().GetItemText(nIdex, 0));
GetDocument()->UpdateAllViews(this);
}
else
{
CString strFileName = GetDocument()->GetCurParentFilePath();
CString strFilePath = GetDocument()->GetCurParentFilePath();
strFilePath.TrimRight('\\');
strFileName += GetListCtrl().GetItemText(nIdex, 0);
ShellExecute(NULL, _T("open"), strFileName, NULL,
strFilePath, SW_SHOW);
}
//GetListCtrl().
*pResult = 0;
}
void CFileShowView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CListCtrl& thisCtrl = GetListCtrl();
if(pNMListView->iSubItem == 0)
{
thisCtrl.SortItems(CompareFileNameAscend, (LPARAM)&thisCtrl);
m_bAccend = !m_bAccend;
}
else if(pNMListView->iSubItem == 1)
{
thisCtrl.SortItems(CompareFileSize, (LPARAM)&thisCtrl);
m_bAccend = !m_bAccend;
}
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -