📄 bcgpshelltree.cpp
字号:
{
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 + -