📄 fileview.cpp
字号:
// FileView.cpp : implementation file
//
#include "stdafx.h"
#include "QuickImage.h"
#include "FileView.h"
//#include <Lmshare.h>
#include "DirFrm.h"
#include "QuickView.h"
#include "DirView.h"
#include "Global.h"
#include "resource.h"
#include "DlgRename.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern bool g_bShowHide;
extern CString g_strCurrentDir;
extern int g_iSortColumn;
/////////////////////////////////////////////////////////////////////////////
// CFileView
IMPLEMENT_DYNCREATE(CFileView, CListView)
CFileView::CFileView()
{
g_iSortColumn = 0;
}
CFileView::~CFileView()
{
}
BEGIN_MESSAGE_MAP(CFileView, CListView)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CFileView)
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(ID_FILE_RENAME, OnFileRename)
ON_UPDATE_COMMAND_UI(ID_FILE_RENAME, OnUpdateFileRename)
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_DIR_UP, ID_DIR_END, OnDirButtons)
ON_UPDATE_COMMAND_UI_RANGE(ID_DIR_UP, ID_DIR_END, OnUpdateDirButtons)
END_MESSAGE_MAP()
//////////////////////
///////////////////////////////////////////////////////
// CFileView drawing
void CFileView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CFileView diagnostics
#ifdef _DEBUG
void CFileView::AssertValid() const
{
CListView::AssertValid();
}
void CFileView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFileView message handlers
BOOL CFileView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszName = WC_LISTVIEW;
cs.style &= ~LVS_TYPEMASK;
cs.style |= LVS_REPORT;
cs.style |= LVS_EDITLABELS;
// cs.style |= LVS_OWNERDATA;
return CListView::PreCreateWindow(cs);
}
void CFileView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl &rListCtrl = GetListCtrl();
HIMAGELIST hImageList;
SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
// Attach ImageList to TreeView
if (hImageList)
::SendMessage(rListCtrl.m_hWnd, LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL,
(LPARAM)hImageList);
/* SHFILEINFO ssfi;
HIMAGELIST hSystemSmallImageList, him;
// CImageList imList;
hSystemSmallImageList = (HIMAGELIST)SHGetFileInfo("C:\\", 0, &ssfi,
sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
him = ImageList_Duplicate(hSystemSmallImageList);
m_ImageList.Create(CImageList::FromHandle(him));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FILE));
m_ImageList.SetBkColor(CLR_NONE);
// ImageList_SetBkColor(him, CLR_NONE);
rListCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);
*/
// DWORD dwExStyle = LVS_EX_FULLROWSELECT| LVS_SHOWSELALWAYS | ES_NOHIDESEL| LVS_EX_SUBITEMIMAGES |//LVS_EX_GRIDLINES |
// LVS_EDITLABELS;//LVS_EX_HEADERDRAGDROP | | LVS_EX_TRACKSELECT | LVS_OWNERDRAWFIXED;
DWORD dwExStyle = LVS_EX_SUBITEMIMAGES | LVS_EDITLABELS | LVS_EX_HEADERDRAGDROP;
rListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(dwExStyle));
CRect rcClient;
GetClientRect(&rcClient);
rListCtrl.InsertColumn( 0, "Name", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
rListCtrl.InsertColumn( 1, "Size", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
rListCtrl.InsertColumn( 2, "Type", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
rListCtrl.InsertColumn( 3, "Date", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
}
void CFileView::ListFiles()
{
ASSERT(g_strCurrentDir.GetLength() > 0);
char szStartDir[MAX_PATH];
sprintf(szStartDir, "%s*.*", g_strCurrentDir);
int iItem = 0;
HANDLE hFile; // Handle to found file
WIN32_FIND_DATA stFindData; // Info about the found file
double dFileSize;
SYSTEMTIME systime;
char szTime[20];
char szTemp[MAX_PATH];
SHFILEINFO sfi;
LVITEM lvi;
CListCtrl &rListCtrl = GetListCtrl();
rListCtrl.DeleteAllItems();
hFile = FindFirstFile((LPCTSTR)szStartDir, &stFindData);
if (INVALID_HANDLE_VALUE == hFile)
{
// MessageBox("FindFirstFile() returned INVALID_HANDLE_VALUE", "DEBUG", MB_OK);
MessageBox("Access denied by system!", "DEBUG", MB_OK);
return;
}
// iImages = rListCtrl.GetImageList(LVSIL_SMALL)->GetImageCount() -1;
do//while (INVALID_HANDLE_VALUE != hFile)
{
if ((0 == strcmp(stFindData.cFileName, "."))
|| (0 == strcmp(stFindData.cFileName, ".."))
|| (stFindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
|| ((stFindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) && !g_bShowHide)
)
{// 跳过"." 和 ".." 和 “系统" 和 "隐藏"
}
else
{//file
sprintf(szTemp, "%s%s", g_strCurrentDir, stFindData.cFileName);
SHGetFileInfo(szTemp, 0, &sfi,sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
SHGFI_ATTRIBUTES | SHGFI_TYPENAME);
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.iItem = iItem;
lvi.iSubItem = 0;
lvi.iImage = sfi.iIcon;// > iImages ? iImages : sfi.iIcon;
lvi.pszText = stFindData.cFileName;
lvi.cchTextMax = MAX_PATH;
// lvi.lParam = (LPARAM)pfi;
rListCtrl.InsertItem(&lvi);
if(!(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
dFileSize = (double)stFindData.nFileSizeHigh * (double)(MAXDWORD+1.0)
+ (double)stFindData.nFileSizeLow;
if(int(dFileSize / 1024) > 0)
{
sprintf(szTemp, "%d K", int(dFileSize / 1024) + 1);
}
else
{
sprintf(szTemp, "%d bytes", (int)dFileSize);
}
rListCtrl.SetItemText(iItem, 1, szTemp);
}
rListCtrl.SetItemText(iItem, 2, sfi.szTypeName);
FileTimeToSystemTime(&stFindData.ftLastWriteTime, &systime);
GetDateFormat(LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE | DATE_USE_ALT_CALENDAR,
&systime,
NULL,
szTime,
64);
strcat(szTime, _T(" "));
GetTimeFormat(LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE|TIME_NOSECONDS,
&systime,
NULL,
szTemp,
32);
strcat(szTime, szTemp);
rListCtrl.SetItemText(iItem, 3, szTime);
iItem++;
}
}while(FindNextFile(hFile, &stFindData));
FindClose(hFile);
GetQuickView()->SetFileName();
rListCtrl.SortItems((PFNLVCOMPARE)SortFunc, (LPARAM)&rListCtrl);
/* LVCOLUMN lvColumn;
int 0, 1, 2, 3;
lvColumn.mask = LVCF_TEXT;
lvColumn.cchTextMax = 5;
lvColumn.pszText = szStartDir;
for(iItem = 0; iItem < 4; iItem++)
{
if(!rListCtrl.GetColumn(iItem, &lvColumn))
break;
if(stricmp(lvColumn.pszText, "name") == 0)
{
0 = iItem;
}
else if(stricmp(lvColumn.pszText, "size") == 0)
{
1 = iItem;
}
else if(stricmp(lvColumn.pszText, "type") == 0)
{
2 = iItem;
}
else if(stricmp(lvColumn.pszText, "date") == 0)
{
3 = iItem;
}
else
{
ASSERT(FALSE);
}
}
*/
}
CQuickView* CFileView::GetQuickView(void)
{
CWnd *pParent = GetParent();
while(NULL != pParent)
{
if(pParent->IsKindOf(RUNTIME_CLASS(CDirFrame)))
return (CQuickView*)(((CDirFrame*)pParent)->m_wndSplitH.GetPane(1, 0));
pParent = pParent->GetParent();
}
return NULL;
}
CDirView* CFileView::GetDirView(void)
{
CWnd *pParent = GetParent();
while(NULL != pParent)
{
if(pParent->IsKindOf(RUNTIME_CLASS(CDirFrame)))
return (CDirView*)(((CDirFrame*)pParent)->m_wndSplitH.GetPane(0, 0));
pParent = pParent->GetParent();
}
return NULL;
}
void CFileView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if (pNMListView->uChanged == LVIF_STATE)
{
CString strFileName;
if(MakeFileNameFromListItem(strFileName))
{
WIN32_FIND_DATA stFindData;
HANDLE hFind = FindFirstFile((LPCTSTR)strFileName, &stFindData);
if (INVALID_HANDLE_VALUE != hFind)
{
if(!(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
GetQuickView()->SetFileName(strFileName);
}
}
FindClose(hFind);
}
}
*pResult = 0;
}
BOOL CFileView::MakeFileNameFromListItem(CString &strFileName, int iItem)
{
CListCtrl &rList = GetListCtrl();
if(-1 == iItem)
{
if(rList.GetSelectedCount() < 1)
{
return FALSE;
}
POSITION pos = rList.GetFirstSelectedItemPosition();
iItem = rList.GetNextSelectedItem(pos);
}
ASSERT(iItem < rList.GetItemCount());
LVCOLUMN lvColumn;
int iName = 0;
lvColumn.mask = LVCF_TEXT;
lvColumn.cchTextMax = 5;
char szLVC[5];
lvColumn.pszText = szLVC;
for(int k = 0; k < 4; k++)
{
if(!rList.GetColumn(k, &lvColumn))
break;
if(stricmp(lvColumn.pszText, "name") == 0)
{
iName = k;
break;
}
}
char szTemp[_MAX_PATH];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -