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

📄 explorertreeview.cpp

📁 类似资源管理器的vc源代码,实现起来相当不容易啊,要细心琢磨
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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);
				
				LPTREEPARAM ptrItem = GetSelTreeData();

				char * szSrc = new char[MAX_PATH];
				ZeroMemory(szSrc,MAX_PATH);
				SHGetPathFromIDList(ptrItem->lpidl,szSrc);
				
				op.AddSourceFile(szSrc);
				BOOL bSuccess, bAPICalled = FALSE, bAborted = FALSE;
				int  nAPIReturn = 0;
				bSuccess = op.Go(&bAPICalled, &nAPIReturn, &bAborted);
				
				delete szSrc;

				//refresh
				if ( bSuccess && !bAborted )
				{
					HTREEITEM hSelect = g_TreeView->m_hSelItem;
					HTREEITEM hParent = g_TreeView->m_pTreeCtrl->GetParentItem(hSelect);
					g_TreeView->m_pTreeCtrl->SelectItem(hParent);
			//		g_TreeView->m_pTreeCtrl->DeleteItem(hSelect);
					g_TreeView->SendMessage(WM_REFRESHFILES,0,0);
					g_ListView->SendMessage(WM_REFRESHFILES,0,0);
				}
				return true;
			}
		case 0x43:     //Ctrl+C
			{
				short ctrl = GetKeyState(VK_CONTROL);
				if ( HIBYTE(ctrl)!=0xff )
					break;

				UINT uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
				HGLOBAL  hGblEffect  = GlobalAlloc(GHND,sizeof(DWORD));
				DWORD * dwDropEffect = (DWORD*)GlobalLock(hGblEffect);
				*dwDropEffect        = DROPEFFECT_COPY;
				GlobalUnlock(hGblEffect);

				LPTREEPARAM ptrItem = (LPTREEPARAM)GetSelTreeData();
				char * szSrc = new char[MAX_PATH];
				ZeroMemory(szSrc,MAX_PATH);
				SHGetPathFromIDList(ptrItem->lpidl,szSrc);
				
				//创建拖拽数据源
				int hgblSize = sizeof(DROPFILES) + ( strlen(szSrc)+2 )* sizeof(_TCHAR);
				HGLOBAL hgblData = ::GlobalAlloc(GHND,hgblSize);
				if (hgblData == NULL)
					return true;
				
				LPDROPFILES pDropFiles = (LPDROPFILES)GlobalLock(hgblData);
				
				pDropFiles->pFiles = sizeof(DROPFILES);
				pDropFiles->fWide = FALSE;
				LPSTR pGlobalString = (LPSTR)(pDropFiles) + sizeof(DROPFILES);
				
				
				strcpy((char*)(pGlobalString), szSrc);
				pGlobalString += ( strlen(szSrc)+1 ) * sizeof(_TCHAR);
				pGlobalString[0] = _T('\0');
				
				GlobalUnlock(hgblData);
				delete szSrc;

				if ( ::OpenClipboard(NULL) ) 
				{
					::EmptyClipboard();
					::SetClipboardData(uDropEffect,hGblEffect);
					::SetClipboardData(CF_HDROP, hgblData);
					::CloseClipboard();
				}
				return true;
			}
		case 0x58:     //Ctrl+X
			{ 
				short ctrl = GetKeyState(VK_CONTROL);
				if ( HIBYTE(ctrl)!=0xff )
					break;

				UINT uDropEffect     = RegisterClipboardFormat("Preferred DropEffect");
				HGLOBAL  hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
				DWORD * dwDropEffect =(DWORD*)GlobalLock(hGblEffect);
				*dwDropEffect        = DROPEFFECT_MOVE;
				GlobalUnlock(hGblEffect);
		
				LPTREEPARAM ptrItem = (LPTREEPARAM)GetSelTreeData();
				char * szSrc = new char[MAX_PATH];
				ZeroMemory(szSrc,MAX_PATH);
				SHGetPathFromIDList(ptrItem->lpidl,szSrc);
				
				//创建拖拽数据源
				int hgblSize = sizeof(DROPFILES)+(strlen(szSrc)+2)*sizeof(_TCHAR);
				
				HGLOBAL hgblData = ::GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,hgblSize);
				if (hgblData == NULL)
					return true;	
				
				LPDROPFILES pDropFiles = (LPDROPFILES)GlobalLock(hgblData);
				
				pDropFiles->pFiles = sizeof(DROPFILES);
				pDropFiles->fWide = FALSE;
				LPSTR pGlobalString = (LPSTR)(pDropFiles) + sizeof(DROPFILES);
				
				strcpy((char*)(pGlobalString), szSrc);
				pGlobalString += ( strlen(szSrc)+1 ) * sizeof(_TCHAR);
				pGlobalString[0] = _T('\0');
				
				GlobalUnlock(hgblData);
				delete szSrc;

				if ( ::OpenClipboard(NULL) ) 
				{
					::EmptyClipboard();
					::SetClipboardData(uDropEffect,hGblEffect);
					::SetClipboardData(CF_HDROP, hgblData);
					::CloseClipboard();

					m_hMoveSrc = m_pTreeCtrl->GetParentItem(m_hSelItem);
				}
				return true;
			}
		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;
			}
		}
	}


	return CTreeView::PreTranslateMessage(pMsg);
}

/////////////////////////////////////////////////////////
//  method
/////////////////////////////////////////////////////////

void CExplorerTreeView::InitImageList()
{
    SHFILEINFO sfi;
    HIMAGELIST himl = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"), 
		0,
		&sfi, 
		sizeof(SHFILEINFO), 
		SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
	if ( himl )
    {
        ::SendMessage(GetSafeHwnd(), TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL,
            (LPARAM)himl);
	}
}

void CExplorerTreeView::InitExplorerTree()
{
//	IShellFolder *psfDesk;
//	ITEMIDLIST   *pidlDesk;
	::SHGetDesktopFolder(&m_psfDesk);
	::SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&m_pidlDesk);
	::SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&m_pidlMyComputer);

	SHFILEINFO    sfi;
	SHGetFileInfo((LPCTSTR)m_pidlDesk,
		            0,
					&sfi, 
					sizeof(SHFILEINFO), 
					SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_DISPLAYNAME);	

	TV_INSERTSTRUCT TCItem;
	ZeroMemory(&TCItem,sizeof(TV_INSERTSTRUCT));
	TCItem.hParent             = TVI_ROOT;
	TCItem.hInsertAfter        = TVI_LAST;
	TCItem.item.mask           = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_STATE|TVIF_SELECTEDIMAGE;

	TCItem.item.pszText        = sfi.szDisplayName;
	TCItem.item.iImage         = sfi.iIcon;
	TCItem.item.iSelectedImage = sfi.iIcon;
//	TCItem.item.state         |= TVIS_DROPHILITED;

	LPTREEPARAM ptrItem = (LPTREEPARAM)m_pMalloc->Alloc(sizeof(TREEPARAM));
	ptrItem->lpsf    = m_psfDesk;
	ptrItem->lpidl   = m_pidlDesk;
	ptrItem->uParam  = 1;
	TCItem.item.lParam  = (LPARAM)ptrItem;

	m_hDesktop = m_pTreeCtrl->InsertItem(&TCItem);

	AddChildren(m_psfDesk,m_pidlDesk,m_hDesktop,true);
	
	m_pTreeCtrl->Expand(m_hMyComputer,TVE_EXPAND);
	m_pTreeCtrl->SelectItem(m_hMyComputer);
}

void CExplorerTreeView::AddChildren(IShellFolder * psfParent, LPITEMIDLIST pidlParent, HTREEITEM hParent, BOOL bExpand)
{
	IEnumIDList  * peidl;
	LPITEMIDLIST pidl, pidlAbs;
	IShellFolder * psf = NULL;

	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);

		hr = psfParent->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&psf);
		if (hr == S_FALSE || psf == NULL)
			break;

		SHFILEINFO    sfi;
		SHGetFileInfo((LPCTSTR)pidlAbs,
			0,
			&sfi, 
			sizeof(SHFILEINFO), 
			SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_DISPLAYNAME);	
		
		TV_INSERTSTRUCT TCItem;
		TCItem.hParent             = hParent;
		TCItem.item.mask           = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
		TCItem.item.pszText        = sfi.szDisplayName;
		TCItem.item.iImage         = sfi.iIcon;
		TCItem.item.iSelectedImage = sfi.iIcon;
		
		LPTREEPARAM ptrItem = (LPTREEPARAM)m_pMalloc->Alloc(sizeof(TREEPARAM));
		ptrItem->lpsf    = psf;
		ptrItem->lpidl   = pidlAbs;
		if ( bExpand )
			ptrItem->uParam  = 1;
		else
			ptrItem->uParam  = 0;
		TCItem.item.lParam   = (LPARAM)ptrItem;
		
		HTREEITEM hCur = m_pTreeCtrl->InsertItem(&TCItem);
		if ( hParent==m_hDesktop )
		{
			if ( ComparePidls(m_psfDesk, m_pidlMyComputer, pidlAbs) )
				m_hMyComputer = hCur;
		}
		if ( bExpand )
			AddChildren(psf,pidlAbs, hCur, false);
	}

	peidl->Release();


	if ( m_psfDesk->CompareIDs(0,m_pidlDesk,pidlParent)==0 )
	{
	}
	else if ( m_psfDesk->CompareIDs(0,m_pidlMyComputer,pidlParent)==0 )
	{
	}
	else
	{
		m_pTreeCtrl->SortChildren(hParent);
	}
	if ( bExpand )
		m_pTreeCtrl->Expand(hParent,TVE_EXPAND);

}

int CALLBACK CExplorerTreeView::SortMyComputer(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CTreeCtrl * pTreeCtrl = (CTreeCtrl*)lParamSort;

	CString    str1 = pTreeCtrl->GetItemText((HTREEITEM)lParam1);
	if ( str1.Right(2)==":)" )
	{
		str1 = str1.Right(3);
	}
	else
	{
		str1 = "Z" + str1;
	}
	
	CString    str2 = pTreeCtrl->GetItemText((HTREEITEM) lParam2);
	if ( str2.Right(2)==":)" )
	{
		str2 = str2.Right(3);
	}
	else
	{
		str2 = "Z" + str2;
	}
	
	return strcmp(str2, str1);
}

/*给子项添加文件夹
*/
void CExplorerTreeView::SetSubItemFolder(TV_ITEM tvItemParent)
{
	HTREEITEM hItemParent = tvItemParent.hItem;
	
	HTREEITEM hItem = m_pTreeCtrl->GetChildItem(hItemParent);
	while (hItem != NULL)
	{
		LPTREEPARAM ptrItem = (LPTREEPARAM)m_pTreeCtrl->GetItemData(hItem);
		CString s = m_pTreeCtrl->GetItemText(hItem);
		if ( ptrItem->uParam==0 )
		{
			TV_ITEM tvItem;
			tvItem.hItem = hItem;
			tvItem.mask = TVIF_HANDLE|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
			m_pTreeCtrl->GetItem(&tvItem);
			AddChildren(ptrItem->lpsf,ptrItem->lpidl,hItem,false);
			ptrItem->uParam = 1;
		}
		hItem = m_pTreeCtrl->GetNextItem(hItem, TVGN_NEXT);
	}
//	PostMessage(WM_REFRESHFILES,(WPARAM)hItemParent,0);
}

void CExplorerTreeView::SetTreeContext(IShellFolder *psfParent, LPITEMIDLIST pidlParent)
{
	HTREEITEM hSelect = m_pTreeCtrl->GetSelectedItem();
	m_pTreeCtrl->Expand(hSelect,TVE_EXPAND);
	
	HTREEITEM hChildItem = m_pTreeCtrl->GetChildItem(hSelect);
	while (hChildItem != NULL)
	{
		LPTREEPARAM ptrItem = (LPTREEPARAM)m_pTreeCtrl->GetItemData(hChildItem);
		if ( ComparePidls(m_psfDesk,pidlParent,ptrItem->lpidl) )
		{
			m_pTreeCtrl->SelectItem(hChildItem);
		}
		hChildItem = m_pTreeCtrl->GetNextItem(hChildItem, TVGN_NEXT);
	}

}

LPTREEPARAM CExplorerTreeView::GetSelTreeData()
{
	LPTREEPARAM pliParam  = (LPTREEPARAM)m_pTreeCtrl->GetItemData(m_hSelItem);		
	return pliParam;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -