16,472
社区成员
发帖
与我相关
我的任务
分享
// CDirTreeCtrl
CDirTreeCtrl::CDirTreeCtrl()
{
}
CDirTreeCtrl::~CDirTreeCtrl()
{
}
BEGIN_MESSAGE_MAP(CDirTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CDirTreeCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)//展开目录
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDirTreeCtrl message handlers
void CDirTreeCtrl::Initialize()
{
LPITEMIDLIST itemlist;
char buf[256];
int iDesktopIcon;
int iComputerIcon;
DeleteAllItems();
SetImageList (NULL,0);
SHGetSpecialFolderLocation (this->m_hWnd, CSIDL_DESKTOP, &itemlist);
SHGetPathFromIDList(itemlist, buf );
m_DesktopPath=buf;
m_ImageList.Create( GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_COLOR24, 50, 50);
m_ImageList.SetBkColor( GetSysColor(COLOR_WINDOW) );
iDesktopIcon = m_ImageList.Add(ExtractIcon( AfxGetApp()->m_hInstance, "shell32.dll", 34));
iComputerIcon = m_ImageList.Add(ExtractIcon( AfxGetApp()->m_hInstance, "shell32.dll", 15));
m_DrivesRoot = InsertItems("我的电脑", TVI_ROOT, true, iComputerIcon, iComputerIcon);
m_DesktopRoot = AddItem(m_DesktopPath , TVI_ROOT, true, iDesktopIcon, iDesktopIcon);
}
HTREEITEM CDirTreeCtrl::AddItem(const char * path, HTREEITEM parent, bool isDir, int iconEx, int iconEx2)
{
SHFILEINFO shinfo, shinfo_sel;
SHGetFileInfo( path, NULL,
&shinfo,
sizeof(shinfo),
SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON);
SHGetFileInfo( path, NULL,
&shinfo_sel,
sizeof(shinfo_sel),
SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_OPENICON | SHGFI_SMALLICON);
int icon = iconEx !=-1 ? iconEx : m_ImageList.Add(shinfo.hIcon);
int iconsel = iconEx2!=-1 ? iconEx2 : m_ImageList.Add(shinfo_sel.hIcon);
SetImageList (&m_ImageList,LVSIL_NORMAL);
return InsertItems ( shinfo.szDisplayName, parent, isDir, icon, iconsel);
}
void CDirTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TV_ITEM itm= pNMTreeView->itemNew;
if (itm.state & TVIS_EXPANDED)
ExpandBranch(itm.hItem);
else
{
DeleteAllChild(itm.hItem);
}
*pResult = 0;
}
void CDirTreeCtrl::DeleteAllChild(HTREEITEM itm, bool isEmpty)
{
HTREEITEM child;
child= GetChildItem(itm);
while (child)
{
if (GetChildItem(child))
DeleteAllChild(GetChildItem(child), isEmpty);
DeleteItem (child);
SetImageList(&m_ImageList,TVSIL_NORMAL);
child= GetChildItem(itm);
}
if (isEmpty)
InsertItem( "",itm);;
}
void CDirTreeCtrl::ExpandBranch(HTREEITEM parent)
{
bool bOne=false;
if(parent==m_DrivesRoot)
{
char *ptr;
DeleteAllChild(parent,false);
GetLogicalDriveStrings(500,m_DrivesName);
ptr=m_DrivesName;
while (*ptr)
{
bOne=true;
AddItem(ptr, m_DrivesRoot, true);
ptr+=strlen(ptr)+1;
}
}
else
{
m_strFullPath = "";
CString pathWildcard;
m_strFullPath=GetPathFromHere(m_strFullPath, parent);
DeleteAllChild(parent,false);
pathWildcard=m_strFullPath+"*.*";
CFileFind finder;
BOOL bWorking = finder.FindFile(pathWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if ( finder.IsDirectory() && !finder.IsDots() )
{
bOne=true;
HTREEITEM itm=AddItem (m_strFullPath+finder.GetFileName(), parent );
InsertItem("",itm);
}
}
bWorking = finder.FindFile(pathWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if ( !finder.IsDirectory())
{
bOne=true;
AddItem (m_strFullPath+finder.GetFileName(), parent );
}
}
}
if (!bOne) InsertItem( "",parent);
}
HTREEITEM CDirTreeCtrl::InsertItems(const char * name, HTREEITEM parent, bool isDir, int icon,int iconOpen)
{
HTREEITEM hitm;
hitm=InsertItem( name, icon, iconOpen, parent);
if (isDir) InsertItem( "",hitm);
return hitm;
}
CString CDirTreeCtrl::GetPathFromHere(CString s, HTREEITEM itm)
{
HTREEITEM parent = GetParentItem(itm);
HTREEITEM itmChild = GetChildItem(itm);
if(!itmChild) return GetPathFromHere(s,parent);
if (itm==m_DrivesRoot) return "";
if (parent==m_DrivesRoot)
{
HTREEITEM child;
char *ptr=m_DrivesName;
child=GetChildItem(parent);
while (child)
{
if (child==itm)
{
s=CString(ptr)+s;
return s;
}
ptr+=strlen(ptr)+1;
child=GetNextItem(child, TVGN_NEXT);
}
}
else if (itm==m_DesktopRoot)
{
s=m_DesktopPath+'\\'+s;
return s;
}
else
{
if (GetItemText(itm)!= CString(""))
s=GetItemText(itm)+'\\'+s;
s=GetPathFromHere(s,parent);
}
if (!itmChild && s.GetLength()>0)
s=s.Left (s.GetLength()-1);
return s;
}
CString CDirTreeCtrl::GetFullPath(HTREEITEM item)
{
if (GetItemText(item)==CString("")) return "";
else return GetPathFromHere("",item);
}
bool CDirTreeCtrl::SetFolder(CString path_in)
{
char path[MAX_PATH];
char *delimiters="\\";
char *token;
char *pathStart=path;
HTREEITEM current=m_DrivesRoot;
strcpy(path,path_in);
Expand(current,TVE_EXPAND );
token=strtok (path,delimiters);
while (token!=NULL)
{
current=DirToItem(current, token);
if (!current)
{
return false;
}
Expand(current,TVE_EXPAND );
token=strtok(NULL,delimiters);
}
SelectItem(current);
return true;
}
HTREEITEM CDirTreeCtrl::DirToItem(HTREEITEM current, char *dir)
{
if (current==m_DrivesRoot)
{
HTREEITEM child;
CString szDir(dir);
szDir+="\\";
szDir.MakeUpper();
char *ptr=m_DrivesName;
child=GetChildItem(current);
while (child)
{
if (szDir==CString(ptr))
{
return child;
}
ptr+=strlen(ptr)+1;
child=GetNextItem(child, TVGN_NEXT);
}
}
else
{
HTREEITEM child;
CString szChildText;
CString szDir(dir);
szDir.MakeUpper();
child=GetChildItem(current);
while (child)
{
szChildText=GetItemText(child);
szChildText.MakeUpper();
if ( szChildText==szDir)
{
return child;
}
child=GetNextItem(child, TVGN_NEXT);
}
}
return NULL;
}
int CDirTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
Initialize();
return 0;
}
CDirTreeCtrl m_tree;
m_tree.Initialize();//调用初始目录树函数
#if !defined(AFX_DIRTREECTRL_H__80A4D0AB_0840_4000_AEE1_19E003A9D268__INCLUDED_)
#define AFX_DIRTREECTRL_H__80A4D0AB_0840_4000_AEE1_19E003A9D268__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DirTreeCtrl.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CDirTreeCtrl window
class CDirTreeCtrl : public CTreeCtrl
{
// Construction
public:
CDirTreeCtrl();
// Attributes
public:
CString m_strFullPath;
// Operations
public:
void Initialize ();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDirTreeCtrl)
//}}AFX_VIRTUAL
// Implementation
public:
bool SetFolder (CString path);
CString GetFullPath (HTREEITEM item);
virtual ~CDirTreeCtrl();
// Generated message map functions
protected:
//{{AFX_MSG(CDirTreeCtrl)
afx_msg void OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
HTREEITEM DirToItem(HTREEITEM current, char *dir);
CString GetPathFromHere (CString s, HTREEITEM itm);
HTREEITEM InsertItems (const char *name, HTREEITEM parent, bool isDir, int icon, int iconOpen);
void ExpandBranch (HTREEITEM parent);
void DeleteAllChild (HTREEITEM itm, bool isEmpty=true);
HTREEITEM AddItem(const char * path, HTREEITEM parent, bool isDir=FALSE, int iconEx=-1, int iconEx2=-1);
HTREEITEM m_DesktopRoot;//desktop_root;
CString m_DesktopPath;
HTREEITEM m_DrivesRoot;
char m_DrivesName[512];
CImageList m_ImageList;
};