📄 iefoldertreectrl.cpp
字号:
int nSelImage=0;
// get icons for new fq pidl
m_ShellPidl.GetNormalAndSelectedIcons(lptvid->lpifq, nImage, nSelImage);
// save folder for later use(when node is expanded)
lptvid->lpsfParent = pFolder; // pointer to parent folder
// keep hold of it(will be released in clean up)
lptvid->lpsfParent->AddRef();
// add the node to the tree unsorted (will be sorted later)
int nChildren = 0;
if (FileInfo.dwAttributes & SFGAO_HASSUBFOLDER)
{
nChildren=1;
}
HTREEITEM hNewItem = AddAnItem(hItem,FileInfo.szDisplayName,(DWORD)lptvid,(HTREEITEM)TVI_FIRST,nImage,nSelImage,nChildren);
// set overlay images
if (hNewItem)
{
SetAttributes(hNewItem,pFolder,pidl);
}
return hNewItem;
}
void CIEFolderTreeCtrl::SetAttributes(HTREEITEM hItem,LPSHELLFOLDER pFolder,LPITEMIDLIST pidl)
{
DWORD dwAttributes = SFGAO_DISPLAYATTRMASK | SFGAO_REMOVABLE;
HRESULT hr = pFolder->GetAttributesOf(1,(LPCITEMIDLIST*)&pidl,&dwAttributes);
if (FAILED(hr))
return;
if ((dwAttributes & SFGAO_COMPRESSED) && GetShellSettings().ShowCompColor())
SetTextColor(hItem,RGB(0,0,255));
else
SetDefaultTextColor(hItem);
if (dwAttributes & SFGAO_GHOSTED)
SetItemState(hItem,TVIS_CUT,TVIS_CUT);
else
SetItemState(hItem,TVIS_CUT,0);
if (dwAttributes & SFGAO_LINK)
SetItemState(hItem,INDEXTOOVERLAYMASK(2),TVIS_OVERLAYMASK);
else
SetItemState(hItem,0,TVIS_OVERLAYMASK);
if (dwAttributes & SFGAO_SHARE)
SetItemState(hItem,INDEXTOOVERLAYMASK(1),TVIS_OVERLAYMASK);
else
SetItemState(hItem,0,TVIS_OVERLAYMASK);
}
BEGIN_MESSAGE_MAP(CIEFolderTreeCtrl, CUITreeCtrl)
//{{AFX_MSG_MAP(CIEFolderTreeCtrl)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_MESSAGE(WM_SETTINGCHANGE,OnSettingChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CIEFolderTreeCtrl message handlers
int CIEFolderTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CUITreeCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
BOOL CIEFolderTreeCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
// No label editing for Explorer items
cs.style |= (TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS);
return CTreeCtrl::PreCreateWindow(cs);
}
void CIEFolderTreeCtrl::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
// TODO: Add your specialized code here and/or call the base class
CUITreeCtrl::CalcWindowRect(lpClientRect, nAdjustType);
}
LPCITEMIDLIST CIEFolderTreeCtrl::GetPathPidl(HTREEITEM hItem)
{
if (hItem == NULL)
return NULL;
LPLVITEMDATA plvit = (LPLVITEMDATA)GetItemData(hItem);
ASSERT(plvit);
if (plvit == NULL)
return NULL;
return plvit->lpifq;
}
LPSHELLFOLDER CIEFolderTreeCtrl::GetItemFolder(HTREEITEM hItem)
{
LPTVITEMDATA lpidCurr = (LPTVITEMDATA)GetItemData(hItem);
ASSERT(lpidCurr);
if (lpidCurr == NULL)
return NULL;
LPSHELLFOLDER psfCurr=NULL;
if (lpidCurr->lpsfParent)
lpidCurr->lpsfParent->BindToObject(lpidCurr->lpi,0,IID_IShellFolder,(LPVOID*)&psfCurr);
if (psfCurr == NULL)
{
SHGetDesktopFolder(&psfCurr);
}
return psfCurr;
}
CString CIEFolderTreeCtrl::GetPathName(HTREEITEM hItem)
{
if (hItem == NULL)
hItem = GetSelectedItem();
CString sPath;
if (hItem == NULL)
return sPath;
LPTVITEMDATA lptvid = (LPTVITEMDATA)GetItemData(hItem);
if (lptvid != NULL)
{
SHGetPathFromIDList(lptvid->lpifq,sPath.GetBuffer(MAX_PATH));
sPath.ReleaseBuffer();
}
return sPath;
}
void CIEFolderTreeCtrl::SetButtonState(HTREEITEM hItem)
{
LPSHELLFOLDER psfCurr=GetItemFolder(hItem);
if (psfCurr == NULL)
return;
IEnumIDList* pItems=NULL;
HRESULT hr = psfCurr->EnumObjects(NULL, SHCONTF_FOLDERS, &pItems);
int nChildren=0;
if (SUCCEEDED(hr))
{
pItems->Release();
nChildren=1;
}
if (nChildren == 1 && !ItemHasChildren(hItem))
{
TVITEM tv;
tv.mask = TVIF_CHILDREN;
ZeroMemory(&tv,sizeof(tv));
SetItem(&tv);
}
psfCurr->Release();
}
void CIEFolderTreeCtrl::RefreshNode(HTREEITEM hItem)
{
// If the item is not expanded, update its button state and return.
if (!(GetItemState(hItem, TVIS_EXPANDED) & TVIS_EXPANDED))
{
SetButtonState(hItem);
return;
}
LPSHELLFOLDER psfCurr=GetItemFolder(hItem);
if (psfCurr == NULL)
return;
mapPidlToHTREEITEM mPidlCurr;
vecPidl vPidlNew;
HTREEITEM hSelItem = GetSelectedItem();
HTREEITEM hChild = GetChildItem(hItem);
while (hChild != NULL)
{
HTREEITEM hNextItem = GetNextSiblingItem(hChild);
LPTVITEMDATA lpid = (LPTVITEMDATA)GetItemData(hChild);
mPidlCurr[CShellPidlCompare(psfCurr,lpid->lpi)] = hChild;
hChild = hNextItem;
}
LPITEMIDLIST pidlNext=NULL;
LPITEMIDLIST pidlCopy=NULL;
IEnumIDList* pItems=NULL;
DWORD dwFlags = SHCONTF_FOLDERS;
if (GetShellSettings().ShowAllObjects() && !GetShellSettings().ShowSysFiles())
dwFlags |= SHCONTF_INCLUDEHIDDEN;
HRESULT hr = psfCurr->EnumObjects(NULL, dwFlags, &pItems);
while (NOERROR == hr)
{
hr = pItems->Next(1, &pidlNext, NULL);
if (hr == S_FALSE || pidlNext == NULL)// || pidlNext == pidlCopy)
break;
pidlCopy = pidlNext;
mapPidlToHTREEITEM::iterator it = mPidlCurr.find(CShellPidlCompare(psfCurr,pidlNext));
if (it != mPidlCurr.end())
{
mPidlCurr.erase(it);
}
else
{
SetAttributes((*it).second,psfCurr,pidlNext);
vPidlNew.push_back(GetShellPidl().CopyItemIDList(pidlNext));
}
GetShellPidl().FreePidl(pidlNext);
pidlNext=NULL;
}
if (pItems)
pItems->Release();
for(mapPidlToHTREEITEM::iterator it1=mPidlCurr.begin();it1 != mPidlCurr.end();it1++)
{
HTREEITEM hDelItem = (*it1).second;
#ifdef _DEBUG
CString sPath;
GetShellPidl().SHPidlToPathEx((*it1).first.GetPidl(),sPath,psfCurr);
TRACE1("Deleting item %s in tree refresh\n",sPath);
#endif
DeleteItem(hDelItem);
}
HTREEITEM hSortItem=NULL;
for(vecPidl::iterator it2=vPidlNew.begin();it2 != vPidlNew.end();it2++)
{
AddFolder(hItem,*it2,psfCurr);
hSortItem = hItem;
}
if (hSortItem)
Sort(hSortItem,psfCurr);
// Remove all items from the map
mPidlCurr.erase(mPidlCurr.begin(),mPidlCurr.end());
vPidlNew.erase(vPidlNew.begin(),vPidlNew.end());
psfCurr->Release();
// Now repeat this procedure for hItem's children.
hChild = GetChildItem(hItem);
while (hChild != NULL)
{
RefreshNode(hChild);
hChild = GetNextSiblingItem (hChild);
}
}
void CIEFolderTreeCtrl::Init()
{
CUITreeCtrl::Init();
GetShellSettings().GetSettings();
// TODO: Add your specialized code here and/or call the base class
// Get the handle to the system image list, for our icons
SHFILEINFO sfi;
m_hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"),
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
// Attach ImageList to TreeCtrl
if (m_hImageList)
::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM) TVSIL_NORMAL,(LPARAM)m_hImageList);
}
void CIEFolderTreeCtrl::OnDestroy()
{
SetImageList(NULL,TVSIL_NORMAL);
CUITreeCtrl::OnDestroy();
}
LRESULT CIEFolderTreeCtrl::OnSettingChange(WPARAM wParam,LPARAM lParam)
{
LPCTSTR lpszSection=(LPCTSTR)lParam;
if (lpszSection == NULL)
return 0L;
if (lstrcmpi(lpszSection, _T("ShellState")) == 0)
{
GetShellSettings().GetSettings();
Refresh();
}
return 1L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -