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

📄 iefoldertreectrl.cpp

📁 vc座的资源管理器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -