📄 dirtreectrl.cpp
字号:
// DirTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "shlobj.h"
#include "DirTreeCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDirTreeCtrl
//
// By Nicola Delfino 1999 delfinon@altavista.net
//
//
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
// THE AUTHOR DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED,
// INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL,
// CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES,
//
////////////////////////////////////////////////////////////////////////////
CDirTreeCtrl::CDirTreeCtrl()
{
}
CDirTreeCtrl::~CDirTreeCtrl()
{
}
BEGIN_MESSAGE_MAP(CDirTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CDirTreeCtrl)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDirTreeCtrl message handlers
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_img.Add(shinfo.hIcon);
int iconsel = iconEx2!=-1 ? iconEx2 : m_img.Add(shinfo_sel.hIcon);
SetImageList (&m_img,LVSIL_NORMAL);
if(!strcmp(path,dr))
return AddItem_Core(path,parent,isDir,icon,iconsel);
return AddItem_Core ( 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)
{
int img1, img2;
if (GetChildItem(child))
DeleteAllChild(GetChildItem(child), isEmpty);
GetItemImage(child,img1,img2);
if (img2!=0 && img2!=img1)
{
m_img.Remove(img2);
RefreshTreeImages(m_drives_root, img2);
}
if (img1!= 0)
{
m_img.Remove(img1);
RefreshTreeImages(m_drives_root, img1);
}
DeleteItem (child);
SetImageList(&m_img,TVSIL_NORMAL);
child= GetChildItem(itm);
}
if (isEmpty)
InsertItem( "",itm);;
}
void CDirTreeCtrl::ExpandBranch(HTREEITEM parent)
{
bool bOne=false;
CString fullpath,pathWildcard;
fullpath=GetPathFromHere(fullpath, parent);
DeleteAllChild(parent,false);
pathWildcard=fullpath+"*.*";
CFileFind finder;
if(pathWildcard!="*.*")
{
BOOL bWorking = finder.FindFile(pathWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if ( finder.IsDirectory() && !finder.IsDots() )
{
bOne=true;
HTREEITEM itm=AddItem (fullpath+finder.GetFileName(), parent );
InsertItem("",itm);
}
}}
// if (!bOne) InsertItem( "",parent);
}
HTREEITEM CDirTreeCtrl::AddItem_Core(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 (itm==m_drives_root) return GetItemText(itm);
if (GetItemText(itm)!= CString(""))
s=GetItemText(itm)+'\\'+s;
if(parent==m_drives_root)
return GetItemText(parent)+s;
s=GetPathFromHere(s,parent);
// remove the last '\' if it isn't a directory
if (!itmChild && s.GetLength()>0)
s=s.Left (s.GetLength()-1);
return s;
}
/* if image number is more than img number -- */
void CDirTreeCtrl::RefreshTreeImages(HTREEITEM item,int img)
{
int iStandard, iOpen;
HTREEITEM itmCurrent;
itmCurrent=GetChildItem(item);
while (itmCurrent)
{
if (GetItemImage(itmCurrent,iStandard,iOpen))
{
if (iStandard>img) iStandard--;
if (iOpen>img) iOpen--;
SetItemImage(itmCurrent,iStandard, iOpen);
}
if (ItemHasChildren( itmCurrent)!=0)
{
RefreshTreeImages(itmCurrent, img);
}
itmCurrent=GetNextSiblingItem(itmCurrent);
}
}
CString CDirTreeCtrl::GetFullPath(HTREEITEM item)
{
if (GetItemText(item)==CString("")) return "";
else return GetPathFromHere("",item);
}
bool CDirTreeCtrl::SetPath(CString path_in)
{
char path[MAX_PATH];
char *delimiters="\\";
char *token;
char *pathStart=path;
HTREEITEM current=m_drives_root;
strcpy(path,path_in);
Expand(current,TVE_EXPAND );
token=strtok (path,delimiters);
while (token!=NULL)
{
current=Dir2Item(current, token);
if (!current)
{
return false;
}
token=strtok(NULL,delimiters);
}
SelectItem(current);
return true;
}
HTREEITEM CDirTreeCtrl::Dir2Item(HTREEITEM current, char *dir)
{
if (current==m_drives_root)
{
HTREEITEM child;
CString szDir(dir);
szDir+="\\";
szDir.MakeLower();
CString ptr=dr;
child=GetChildItem(current);
while (child)
{
if (szDir==ptr)
{
return child;
}
ptr+=ptr.GetLength()+1;
child=GetNextItem(child, TVGN_NEXT);
}
}
else
{
HTREEITEM child;
CString szChildText;
CString szDir(dir);
szDir.MakeLower();
child=current;
while (child)
{
szChildText=GetItemText(child);
szChildText.MakeLower();
if ( szChildText==szDir)
{
CString ss=GetItemText(child);
Expand(child,TVE_EXPAND );
child=GetChildItem(child);
return child;
}
child=GetNextItem(child, TVGN_NEXT);
}
}
return NULL;
}
void CDirTreeCtrl::SetdriveBoot(HICON icon,CString root)
{
LPITEMIDLIST itemlist;
SHFILEINFO shinfo;
char buf[300];
int ret;
dr=root;
m_img.Detach();
DeleteAllItems();
SetImageList (NULL,0);
SHGetSpecialFolderLocation (this->m_hWnd, CSIDL_DESKTOP, &itemlist);
SHGetPathFromIDList(itemlist, buf );
m_img.Create( GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_COLOR24, 50, 50);
m_img.SetBkColor( RGB(232,215,136) );
CBitmap bmp;
CBitmap *old;
CBitmap *newbmp;
CDC dc;
dc.CreateCompatibleDC(NULL);
bmp.CreateBitmap (32,32,1,24,NULL);
old=dc.SelectObject (&bmp);
dc.FillSolidRect(0,0,31,31,GetSysColor(COLOR_WINDOW));
newbmp=dc.SelectObject (old);
dc.DeleteDC ();
ret=m_img.Add(newbmp,COLORREF(0x00));
SHGetFileInfo( root, NULL,
&shinfo,
sizeof(shinfo),
SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON);
mycomputerIcon= m_img.Add(shinfo.hIcon);
m_drives_root=AddItem(root, TVI_ROOT, true, mycomputerIcon, mycomputerIcon);
}
void CDirTreeCtrl::OnDestroy()
{
CTreeCtrl::OnDestroy();
// TODO: Add your message handler code here
m_img.DeleteImageList();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -