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

📄 explorerlistview.cpp

📁 加密工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:

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 + -