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

📄 bcgpshelltree.cpp

📁 关于远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					{
						if (m_pContextMenu2 != NULL)
						{
							m_pContextMenu2->Release();
							m_pContextMenu2 = NULL;
						}
						
						if (idCmd != 0)
						{
							CWaitCursor wait;

							CMINVOKECOMMANDINFO cmi;
							cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
							cmi.fMask = 0;
							cmi.hwnd = hwndParent;
							cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - 1);
							cmi.lpParameters = NULL;
							cmi.lpDirectory = NULL;
							cmi.nShow = SW_SHOWNORMAL;
							cmi.dwHotKey = 0;
							cmi.hIcon = NULL;

							hr = pcm->InvokeCommand (&cmi);

							SetFocus ();
						}
					}
				}
			}
			
			if (pcm != NULL)
			{
				pcm->Release();
				pcm = NULL;
			}
		}
		
		if (psfFolder != NULL)
		{
			psfFolder->Release ();
			psfFolder = NULL;
		}
	}
}
//***************************************************************************************
CString CBCGPShellTree::OnGetItemText (LPBCGCBITEMINFO pItem)
{
	ASSERT (pItem != NULL);
	SHFILEINFO sfi;
	
	if (SHGetFileInfo ((LPCTSTR) pItem->pidlFQ, 0, &sfi, sizeof (sfi),
		SHGFI_PIDL | SHGFI_DISPLAYNAME))
	{
		return sfi.szDisplayName;
	}

	return _T("???");
}
//***************************************************************************************
int CBCGPShellTree::OnGetItemIcon (LPBCGCBITEMINFO pItem, BOOL bSelected)
{
	ASSERT (pItem != NULL);
	SHFILEINFO sfi;

	UINT uiFlags = SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON;

	if (bSelected)
	{
		uiFlags |= SHGFI_OPENICON;
	}
	else
	{
		uiFlags |= SHGFI_LINKOVERLAY;
	}
	
	if (SHGetFileInfo ((LPCTSTR)pItem->pidlFQ, 0, &sfi, sizeof(sfi), uiFlags))
	{
		return sfi.iIcon;
	}

	return -1;
}
//****************************************************************************************
void CBCGPShellTree::OnItemexpanding (NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	HTREEITEM hItem = pNMTreeView->itemNew.hItem;
	ASSERT (hItem != NULL);
	
	switch (pNMTreeView->action)
	{
	case TVE_EXPAND:
		GetChildItems (hItem);

		if (GetChildItem (hItem) == NULL)
		{
			// Remove '+':
			TV_ITEM tvItem;
			ZeroMemory(&tvItem, sizeof(tvItem));

			tvItem.hItem = hItem;
			tvItem.mask = TVIF_CHILDREN;

			SetItem (&tvItem);
		}
		break;
		
	case TVE_COLLAPSE:
		//remove all of the items from this node
		Expand (hItem, TVE_COLLAPSE | TVE_COLLAPSERESET);
		break;
	}
	
	*pResult = 0;
}
//****************************************************************************************
void CBCGPShellTree::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
{
	ASSERT_VALID (g_pShellManager);

	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	
	LPBCGCBITEMINFO pItem = (LPBCGCBITEMINFO) pNMTreeView->itemOld.lParam;
	
	//-------------------------------------
	// Free up the pidls that we allocated:
	//-------------------------------------
	g_pShellManager->FreeItem (pItem->pidlFQ);
	g_pShellManager->FreeItem (pItem->pidlRel);
	
	//-------------------------------------------
	// This may be NULL if this is the root item:
	//-------------------------------------------
	if (pItem->pParentFolder != NULL)
	{
		pItem->pParentFolder->Release ();
	}
	
	GlobalFree ((HGLOBAL) pItem);
	*pResult = 0;
}
//****************************************************************************************
void CBCGPShellTree::OnContextMenu(CWnd* /*pWnd*/, CPoint point) 
{
	if (m_bContextMenu)
	{
		OnShowContextMenu (point);
	}
	else
	{
		Default ();
	}
}
//****************************************************************************************
BOOL CBCGPShellTree::SelectPath (LPCTSTR lpszPath)
{
	ASSERT_VALID (this);
	ASSERT_VALID (g_pShellManager);
	ASSERT (lpszPath != NULL);

	LPITEMIDLIST pidl;
	if (FAILED (g_pShellManager->ItemFromPath (lpszPath, pidl)))
	{
		return FALSE;
	}

	BOOL bRes = SelectPath (pidl);
	g_pShellManager->FreeItem (pidl);

	return bRes;
}
//***************************************************************************************
BOOL CBCGPShellTree::SelectPath (LPCITEMIDLIST lpidl)
{
	BOOL bRes = FALSE;

	ASSERT_VALID (this);
	ASSERT_VALID (g_pShellManager);

	if (lpidl == NULL)
	{
		ASSERT (FALSE);
		return FALSE;
	}

	HTREEITEM htreeItem = GetRootItem ();

	SetRedraw (FALSE);

	if (g_pShellManager->GetItemCount (lpidl) == 0)
	{
		// Desktop
	}
	else
	{
		LPCITEMIDLIST lpidlCurr = lpidl;
		LPITEMIDLIST lpidlParent = NULL;

		CList<LPITEMIDLIST,LPITEMIDLIST> lstItems;
		lstItems.AddHead (g_pShellManager->CopyItem (lpidl));

		while (g_pShellManager->GetParentItem (lpidlCurr, lpidlParent) > 0)
		{
			lstItems.AddHead (lpidlParent);
			lpidlCurr = lpidlParent;
		}

		for (POSITION pos = lstItems.GetHeadPosition (); pos != NULL;)
		{
			LPITEMIDLIST lpidlCurr = lstItems.GetNext (pos);

			if (htreeItem != NULL)
			{
				if (GetChildItem (htreeItem) == NULL)
				{
					Expand (htreeItem, TVE_EXPAND);
				}

				BOOL bFound = FALSE;

				for (HTREEITEM hTreeChild = GetChildItem (htreeItem); 
					!bFound && hTreeChild != NULL;
					hTreeChild = GetNextSiblingItem (hTreeChild))
				{
					LPBCGCBITEMINFO pItem = (LPBCGCBITEMINFO) GetItemData (hTreeChild);
					if (pItem == NULL)
					{
						continue;
					}

					SHFILEINFO sfi1;
					SHFILEINFO sfi2;

					if (SHGetFileInfo ((LPCTSTR) pItem->pidlFQ, 0, &sfi1, sizeof (sfi1), SHGFI_PIDL | SHGFI_DISPLAYNAME) &&
						SHGetFileInfo ((LPCTSTR) lpidlCurr, 0, &sfi2, sizeof (sfi2), SHGFI_PIDL | SHGFI_DISPLAYNAME) &&
						lstrcmp (sfi1.szDisplayName, sfi2.szDisplayName) == 0)
					{
						bFound = TRUE;
						htreeItem = hTreeChild;
					}
				}

				if (!bFound)
				{
					htreeItem = NULL;
				}
			}

			g_pShellManager->FreeItem(lpidlCurr);
		}

		if( lpidlParent )
		{
			g_pShellManager->FreeItem(lpidlParent); // by scaton
		}
	}

	if (htreeItem != NULL)
	{
		m_bNoNotify = TRUE;

		SelectItem (htreeItem);

		if (GetChildItem (htreeItem) == NULL)
		{
			Expand (htreeItem, TVE_EXPAND);
		}

		EnsureVisible (htreeItem);

		m_bNoNotify = FALSE;
		bRes = TRUE;
	}

	SetRedraw ();
	RedrawWindow ();

	return bRes;
}
//****************************************************************************************
BOOL CBCGPShellTree::GetItemPath (CString& strPath, HTREEITEM htreeItem) const
{
	ASSERT_VALID (this);

	BOOL bRes = FALSE;
	strPath.Empty ();

	if (htreeItem == NULL)
	{
		htreeItem = GetSelectedItem ();
	}

	if (htreeItem == NULL)
	{
		return FALSE;
	}

	LPBCGCBITEMINFO pItem = (LPBCGCBITEMINFO) GetItemData (htreeItem);
	if (pItem == NULL || pItem->pidlFQ == NULL || pItem->pidlRel == NULL)
	{
		return FALSE;
	}

	LPSHELLFOLDER lpShellFolder = NULL;
	HRESULT hRes;

	if (pItem->pParentFolder == NULL)
	{
		hRes = SHGetDesktopFolder (&lpShellFolder);
	}
	else
	{
		hRes = pItem->pParentFolder->BindToObject (pItem->pidlRel,
			0, IID_IShellFolder, (LPVOID*) &lpShellFolder);
	}

	if (FAILED (hRes))
	{
		return FALSE;
	}

	ULONG uAttribs = SFGAO_FILESYSTEM;
	if (pItem->pParentFolder != NULL)
	{
		pItem->pParentFolder->GetAttributesOf (1, 
			(const struct _ITEMIDLIST **)&pItem->pidlFQ, &uAttribs);
	}
	// Else - assume desktop

	if ((uAttribs & SFGAO_FILESYSTEM) != 0)
	{
		TCHAR szFolderName [MAX_PATH];
		if (SHGetPathFromIDList (pItem->pidlFQ, szFolderName))
		{
			strPath = szFolderName;
			bRes = TRUE;
		}
	}

	if (lpShellFolder != NULL)
	{
		lpShellFolder->Release ();
	}

	return bRes;
}
//***************************************************************************************
void CBCGPShellTree::OnRButtonDown(UINT /*nFlags*/, CPoint point) 
{
	SetFocus ();
	SelectItem (HitTest (point));
}
//***************************************************************************************
void CBCGPShellTree::EnableShellContextMenu (BOOL bEnable)
{
	m_bContextMenu = bEnable;
}
//******************************************************************************************
BOOL CBCGPShellTree::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
{
	if (message == WM_NOTIFY && !m_bNoNotify)
	{
		LPNMHDR lpnmh = (LPNMHDR) lParam;
		ASSERT (lpnmh != NULL);

		if (lpnmh->code == TVN_SELCHANGED)
		{
			CBCGPShellList* pRelatedShellList = GetRelatedList ();

			if (pRelatedShellList != NULL && 
				GetSelectedItem () != NULL)
			{
				ASSERT_VALID (pRelatedShellList);
				LPBCGCBITEMINFO pItem = (LPBCGCBITEMINFO) GetItemData (GetSelectedItem ());

				pRelatedShellList->m_bNoNotify = TRUE;
				pRelatedShellList->DisplayFolder (pItem);
				pRelatedShellList->m_bNoNotify = FALSE;

				return TRUE;
			}
		}
	}
	
	return CTreeCtrl::OnChildNotify(message, wParam, lParam, pLResult);
}
//***************************************************************************************
void CBCGPShellTree::OnDestroy() 
{
	CBCGPShellList* pList = GetRelatedList ();
	if (pList != NULL)
	{
		pList->m_hwndRelatedTree = NULL;
	}

	CTreeCtrl::OnDestroy();
}
//*********************************************************************************
LRESULT CBCGPShellTree::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	switch (message)
	{
	case WM_INITMENUPOPUP:
	case WM_DRAWITEM:
	case WM_MEASUREITEM:
		if (m_pContextMenu2 != NULL)
		{
			m_pContextMenu2->HandleMenuMsg(message, wParam, lParam);
			return 0;
		}
		break;
	}
	
	return CTreeCtrl::WindowProc(message, wParam, lParam);
}
//*********************************************************************************
void CBCGPShellTree::PreSubclassWindow() 
{
	CTreeCtrl::PreSubclassWindow();

	_AFX_THREAD_STATE* pThreadState = AfxGetThreadState ();
	if (pThreadState->m_pWndInit == NULL)
	{
		InitTree ();
	}
}
//*********************************************************************************
void CBCGPShellTree::InitTree ()
{
	TCHAR szWinDir [MAX_PATH + 1];
	if (GetWindowsDirectory (szWinDir, MAX_PATH) > 0)
	{
		SHFILEINFO sfi;
		SetImageList (CImageList::FromHandle (
			(HIMAGELIST) SHGetFileInfo( 
							szWinDir,
							0,
							&sfi, 
							sizeof (SHFILEINFO), 
							SHGFI_SYSICONINDEX | SHGFI_SMALLICON)), 0);
	}

	Refresh ();
}
//**********************************************************************************
void CBCGPShellTree::SetFlags (DWORD dwFlags, BOOL bRefresh)
{
	ASSERT_VALID (this);
	m_dwFlags = dwFlags;

	if (bRefresh && GetSafeHwnd () != NULL)
	{
		Refresh ();
	}
}

⌨️ 快捷键说明

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