📄 explorerlistview.cpp
字号:
BOOL CExplorerListView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if ( pMsg->message==WM_RENDERFORMAT )
{
long l = pMsg->lParam;
}
if ( pMsg->message==WM_KEYDOWN )
{
HWND hWnd = this->GetSafeHwnd();
switch ( pMsg->wParam )
{
case 0x43: //Ctrl+C
{
short ctrl = GetKeyState(VK_CONTROL);
if ( HIBYTE(ctrl)!=0xFF )
break;
GetParent()->PostMessage(WM_COMMAND,MAKEWPARAM(0,ID_EDIT_COPY),0);
break;
}
case 0x58: //Ctrl+X
{
short ctrl = GetKeyState(VK_CONTROL);
if ( HIBYTE(ctrl)!=0xFF )
break;
GetParent()->PostMessage(WM_COMMAND,MAKEWPARAM(0,ID_EDIT_CUT),0);
break;
}
case 0x56: //Ctrl+V
{
short ctrl = GetKeyState(VK_CONTROL);
if ( HIBYTE(ctrl)!=0xFF )
break;
GetParent()->PostMessage(WM_COMMAND,MAKEWPARAM(0,ID_EDIT_PASTE),0);
break;
}
case 0x2e: //DEL
{
CShellFileOp op;
short lShift = GetKeyState(VK_LSHIFT);
short rShift = GetKeyState(VK_RSHIFT);
if ( HIBYTE(lShift)==0xFF || HIBYTE(rShift)==0xFF )
op.SetOperationFlags(FO_DELETE, this,NULL);
else
op.SetOperationFlags(FO_DELETE, this,FOF_ALLOWUNDO);
POSITION pos = m_pListCtrl->GetFirstSelectedItemPosition();
if ( pos==NULL )
return true;
char * szSrc = new char[MAX_PATH];
while(pos)
{
int nItem = m_pListCtrl->GetNextSelectedItem(pos);
LPLISTPARAM pliItem = (LPLISTPARAM)g_ListView->m_pListCtrl->GetItemData(nItem);
ZeroMemory(szSrc,MAX_PATH);
SHGetPathFromIDList(pliItem->lpidl,szSrc);
op.AddSourceFile(szSrc);
}
delete szSrc;
BOOL bSuccess, bAPICalled = FALSE, bAborted = FALSE;
int nAPIReturn = 0;
bSuccess = op.Go(&bAPICalled, &nAPIReturn, &bAborted);
//refresh
if ( bSuccess&&!bAborted )
{
g_TreeView->SendMessage(WM_REFRESHFILES,(WPARAM)g_TreeView->m_hSelItem,0);
g_ListView->SendMessage(WM_REFRESHFILES,0,0);
}
break;
}
}
}
if (pMsg->message==WM_DROPFILES)
{
short ctrl = HIWORD(pMsg->wParam);
return 0;
}
return CListView::PreTranslateMessage(pMsg);
}
//////////////////////////////////////////////////
// method
///////////////////////////////////////////////////
void CExplorerListView::InitImageList()
{
HIMAGELIST himlSmall;
HIMAGELIST himlLarge;
SHFILEINFO sfi;
himlSmall = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"),
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
himlLarge = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"),
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
if (himlSmall && himlLarge)
{
::SendMessage(GetSafeHwnd(), LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL,
(LPARAM)himlSmall);
::SendMessage(GetSafeHwnd(), LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL,
(LPARAM)himlLarge);
}
}
void CExplorerListView::SetListContext(IShellFolder *psfParent, LPITEMIDLIST pidlParent)
{
m_pListCtrl->DeleteAllItems();
DeleteAllItems();
IEnumIDList *peidl;
LPITEMIDLIST pidl, pidlAbs;
IShellFolder *psf = NULL;
int iActualItem;
HRESULT hr = psfParent->EnumObjects(NULL,SHCONTF_FOLDERS ,&peidl);
if ( NOERROR!=hr )
return;
while (NOERROR == hr)
{
hr = peidl->Next(1, &pidl, NULL);
if (hr == S_FALSE || pidl == NULL)
break;
pidlAbs = ConcatPidl(pidlParent,pidl);
psfParent->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&psf);
SHFILEINFO sfi;
SHGetFileInfo((LPCTSTR)pidlAbs,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|
SHGFI_DISPLAYNAME|SHGFI_ATTRIBUTES|SHGFI_TYPENAME|SHGFI_SELECTED);
LVITEM lvItem;
memset(&lvItem,0,sizeof(lvItem));
lvItem.mask |= LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM ;
lvItem.iItem = m_pListCtrl->GetItemCount();
lvItem.iSubItem = 0;
lvItem.iImage = sfi.iIcon;
lvItem.pszText = sfi.szDisplayName;
LPLISTPARAM pliParam = (LPLISTPARAM)m_pMalloc->Alloc(sizeof(LISTPARAM));
pliParam->lpsf = psf;
pliParam->lpidl = pidlAbs;
pliParam->uType = 0;
strcpy(pliParam->szName,sfi.szDisplayName);
lvItem.lParam = (LPARAM)pliParam;
iActualItem=m_pListCtrl->InsertItem(&lvItem);
//添加类型
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iActualItem;
lvItem.iSubItem = 1;
lvItem.pszText = sfi.szTypeName;
GetListCtrl().SetItem(&lvItem);
//添加大小
m_pMalloc->Free(pidl);
}
peidl->Release(); //若不Release掉文件会处于被操作的状态
if ( g_TreeView )
{
//我的电脑的子项会得到文件和非文件两套
//过滤掉文件的项
if ( ComparePidls(g_TreeView->m_psfDesk, g_TreeView->m_pidlMyComputer, pidlParent) )
return;
}
hr = psfParent->EnumObjects(NULL,SHCONTF_NONFOLDERS ,&peidl);
if ( NOERROR!=hr )
return;
while (NOERROR == hr)
{
hr = peidl->Next(1, &pidl, NULL);
if (hr == S_FALSE || pidl == NULL)
break;
pidlAbs = ConcatPidl(pidlParent,pidl);
psfParent->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&psf);
SHFILEINFO sfi;
SHGetFileInfo((LPCTSTR)pidlAbs,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_DISPLAYNAME|SHGFI_TYPENAME|SHGFI_SELECTED);
LVITEM lvItem;
memset(&lvItem,0,sizeof(lvItem));
lvItem.mask |= LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM ;
lvItem.iItem = m_pListCtrl->GetItemCount();
lvItem.iImage = sfi.iIcon;
lvItem.iSubItem = 0;
lvItem.pszText = sfi.szDisplayName;
LPLISTPARAM pliParam = (LPLISTPARAM)m_pMalloc->Alloc(sizeof(LISTPARAM));
pliParam->lpsf = psf;
pliParam->lpidl = pidlAbs;
pliParam->uType = 1;
strcpy(pliParam->szName,sfi.szDisplayName);
lvItem.lParam = (LPARAM)pliParam;
iActualItem=m_pListCtrl->InsertItem(&lvItem);
//添加类型
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iActualItem;
lvItem.iSubItem = 1;
lvItem.pszText = sfi.szTypeName;
GetListCtrl().SetItem(&lvItem);
//读取文件信息,文件大小,保护状态等
char * szPath = new char[MAX_PATH];
SHGetPathFromIDList(pliParam->lpidl,szPath);
CString filename;
filename.Format("%s",szPath);
delete szPath;
//文件大小的获得
CFileStatus Status;
CString StrFileSize;
CFile::GetStatus(filename,Status);
StrFileSize.Format("%dKB",Status.m_size/1024);
LPTSTR FileSize=StrFileSize.GetBuffer(20);
StrFileSize.ReleaseBuffer();
//获取文件的保护状态
CString Protected_Status;
CFile now_file;
char encrypted_check[4];
now_file.Open(filename,CFile::modeRead,NULL);
now_file.Read(encrypted_check,4);
now_file.Close();
if(encrypted_check[0]=encrypted_check[1]=encrypted_check[2]=encrypted_check[3]=='#')
Protected_Status="加密";
else
Protected_Status="正常";
LPTSTR File_Protected_Status=Protected_Status.GetBuffer(20);
Protected_Status.ReleaseBuffer();
//添加保护状态
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iActualItem;
lvItem.iSubItem = 2;
lvItem.pszText = File_Protected_Status;
GetListCtrl().SetItem(&lvItem);
//添加大小
lvItem.mask = LVIF_TEXT;
lvItem.iItem = iActualItem;
lvItem.iSubItem = 3;
lvItem.pszText = FileSize;
GetListCtrl().SetItem(&lvItem);
}
peidl->Release();
m_pListCtrl->SortItems(SortListView, (DWORD)this);
}
int CALLBACK CExplorerListView::SortListView(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CListCtrl* pListCtrl = (CListCtrl*)lParamSort;
LPLISTPARAM pliParam1 = (LPLISTPARAM)lParam1;
LPLISTPARAM pliParam2 = (LPLISTPARAM)lParam2;
if ( pliParam1->uType==pliParam2->uType )
{
return strcmp(pliParam1->szName, pliParam2->szName);
}
else if (pliParam1->uType<pliParam2->uType)
{
return -1;
}
else
{
return 1;
}
}
int CExplorerListView::SetListViewType(DWORD viewType)
{
if ( m_dViewType==viewType )
return viewType;
int old = m_dViewType;
CMenu * pMainMenu = AfxGetApp()->GetMainWnd()->GetMenu();
CMenu * pMenu = pMainMenu->GetSubMenu(2);
switch(viewType)
{
case LVS_ICON:
pMenu->CheckMenuRadioItem(3,5,3,MF_BYPOSITION);
break;
case LVS_SMALLICON:
pMenu->CheckMenuRadioItem(3,5,4,MF_BYPOSITION);
break;
case LVS_LIST:
pMenu->CheckMenuRadioItem(3,5,5,MF_BYPOSITION);
break;
case LVS_REPORT:
pMenu->CheckMenuRadioItem(3,5,6,MF_BYPOSITION);
break;
}
ModifyStyle(m_dViewType, viewType);
m_dViewType = viewType;
return old;
}
void CExplorerListView::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
CWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
}
void CExplorerListView::DeleteAllItems()
{
int nCount = m_pListCtrl->GetItemCount();
for ( int i=0 ; i<nCount ; i++ )
{
LPLISTPARAM pliParam = (LPLISTPARAM)m_pListCtrl->GetItemData(i);
m_pMalloc->Free(pliParam->lpidl);
m_pMalloc->Free(pliParam);
}
m_pListCtrl->DeleteAllItems();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -