📄 driveview.cpp
字号:
/*
This following Member Functions were Developed by
by Nicola Delfino 1999 delfinon@altavista.net
minor updates carried out by Barretto VN.
1) AddItem
2) AddItem_Core
3) DeleteAllChild
4) ExpandBranch
5) GetPathFromHere
6) RefreshTreeImages
7) MatchExtension
8) GetFullPath
9) SetPath
10) Dir2Item
*/
HTREEITEM CDriveView::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);
m_TreeCtrl.SetImageList (&m_img,LVSIL_NORMAL);
DeviceName = shinfo.szDisplayName;
return AddItem_Core ( shinfo.szDisplayName, parent, isDir, icon, iconsel);
}
HTREEITEM CDriveView::AddItem_Core(const char * name, HTREEITEM parent, bool isDir, int icon,int iconOpen)
{
HTREEITEM hitm;
hitm=m_TreeCtrl.InsertItem( name, icon, iconOpen, parent);
if (isDir) m_TreeCtrl.InsertItem( "",hitm);
return hitm;
}
void CDriveView::DeleteAllChild(HTREEITEM itm, bool isEmpty)
{
HTREEITEM child;
child= m_TreeCtrl.GetChildItem(itm);
while (child)
{
int img1, img2;
if (m_TreeCtrl.GetChildItem(child))
DeleteAllChild(m_TreeCtrl.GetChildItem(child), isEmpty);
m_TreeCtrl.GetItemImage(child,img1,img2);
if (img2!=0 && img2!=img1)
{
m_img.Remove(img2);
RefreshTreeImages(m_drives_root, img2);
RefreshTreeImages(m_desktop_root, img2);
}
if (img1!= 0)
{
m_img.Remove(img1);
RefreshTreeImages(m_drives_root, img1);
RefreshTreeImages(m_desktop_root, img1);
}
m_TreeCtrl.DeleteItem (child);
m_TreeCtrl.SetImageList(&m_img,TVSIL_NORMAL);
child= m_TreeCtrl.GetChildItem(itm);
}
if (isEmpty)
m_TreeCtrl.InsertItem( "",itm);
}
void CDriveView::ExpandBranch(HTREEITEM parent , CString strPath)
{
bool bOne=false;
CMultiDrivesDoc* pDoc = (CMultiDrivesDoc*)GetDocument();
// if(parent==m_drives_root)
// {
// char *ptr;
// DeleteAllChild(parent,false);
// GetLogicalDriveStrings(500,m_drives_name);
// ptr=m_drives_name;
// while (*ptr)
// {
// bOne=true;
// AddItem(strPath, parent , true);
// AddItem(ptr, m_drives_root, true);
// ptr+=strlen(ptr)+1;
// }
// }
// else
// {
CString fullpath,pathWildcard;
// fullpath=GetPathFromHere(fullpath, parent);
DeleteAllChild(parent,false);
// pathWildcard=fullpath+"*.*";
pathWildcard=strPath+"*.*";
pDoc->m_FilesView->DeleteAllListItems();
CFileFind finder;
BOOL bWorking = finder.FindFile(pathWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if ( finder.IsDirectory() && !finder.IsDots() )
{
bOne=true;
HTREEITEM itm= AddItem (strPath+finder.GetFileName(), parent );
m_TreeCtrl.InsertItem("",itm);
}
else
{
CTime ct;
finder.GetCreationTime(ct);
DWORD fs = finder.GetLength();
CString fn = finder.GetFileName();
pDoc->m_FilesView->PopulateListView(strPath+finder.GetFileName(), fn , ct , fs);
}
}
bWorking = finder.FindFile(pathWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if ( !finder.IsDirectory() && MatchExtension(finder.GetFileName()) )
{
bOne=true;
AddItem (fullpath+finder.GetFileName(), parent );
}
}
// }
// if (!bOne) m_TreeCtrl->InsertItem( "",parent);
}
CString CDriveView::GetPathFromHere(CString s, HTREEITEM itm)
{
HTREEITEM parent= m_TreeCtrl.GetParentItem(itm);
HTREEITEM itmChild= m_TreeCtrl.GetChildItem(itm);
// if (itm==m_drives_root) return "";
if (parent==m_drives_root)
{
HTREEITEM child;
char *ptr=m_drives_name;
child= m_TreeCtrl.GetChildItem(parent);
while (child)
{
if (child==itm)
{
s=CString(ptr)+s;
return s;
}
ptr+=strlen(ptr)+1;
child= m_TreeCtrl.GetNextItem(child, TVGN_NEXT);
}
}
else if (itm==m_desktop_root)
{
s=m_desktop_path+'\\'+s;
return s;
}
else
{
if ( m_TreeCtrl.GetItemText(itm)!= CString(""))
s= m_TreeCtrl.GetItemText(itm)+'\\'+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 CDriveView::RefreshTreeImages(HTREEITEM item,int img)
{
int iStandard, iOpen;
HTREEITEM itmCurrent;
itmCurrent= m_TreeCtrl.GetChildItem(item);
while (itmCurrent)
{
if (m_TreeCtrl.GetItemImage(itmCurrent,iStandard,iOpen))
{
if (iStandard>img) iStandard--;
if (iOpen>img) iOpen--;
m_TreeCtrl.SetItemImage(itmCurrent,iStandard, iOpen);
}
if ( m_TreeCtrl.ItemHasChildren( itmCurrent)!=0)
{
RefreshTreeImages(itmCurrent, img);
}
itmCurrent= m_TreeCtrl.GetNextSiblingItem(itmCurrent);
}
}
bool CDriveView::MatchExtension(CString file)
{
return file.Right(4)==CString(".exe");
}
CString CDriveView::GetFullPath(HTREEITEM item)
{
if ( m_TreeCtrl.GetItemText(item)==CString("")) return "";
else return GetPathFromHere("",item);
}
bool CDriveView::SetPath(CString path_in)
{
char path[MAX_PATH];
char *delimiters="\\";
char *token;
char *pathStart=path;
HTREEITEM current=m_drives_root;
strcpy(path,path_in);
m_TreeCtrl.Expand(current,TVE_EXPAND );
token=strtok (path,delimiters);
while (token!=NULL)
{
current=Dir2Item(current, token);
if (!current)
{
return false;
}
m_TreeCtrl.Expand(current,TVE_EXPAND );
token=strtok(NULL,delimiters);
}
m_TreeCtrl.SelectItem(current);
return true;
}
HTREEITEM CDriveView::Dir2Item(HTREEITEM current, char *dir)
{
if (current==m_drives_root)
{
HTREEITEM child;
CString szDir(dir);
szDir+="\\";
szDir.MakeUpper();
char *ptr=m_drives_name;
child= m_TreeCtrl.GetChildItem(current);
while (child)
{
if (szDir==CString(ptr))
{
return child;
}
ptr+=strlen(ptr)+1;
child= m_TreeCtrl.GetNextItem(child, TVGN_NEXT);
}
}
else
{
HTREEITEM child;
CString szChildText;
CString szDir(dir);
szDir.MakeUpper();
child= m_TreeCtrl.GetChildItem(current);
while (child)
{
szChildText= m_TreeCtrl.GetItemText(child);
szChildText.MakeUpper();
if ( szChildText==szDir)
{
return child;
}
child= m_TreeCtrl.GetNextItem(child, TVGN_NEXT);
}
}
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -