📄 dirsystemtreectrl.cpp
字号:
// DirSystemTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "UMIB.h"
#include "DirSystemTreeCtrl.h"
#include "SortStringArray.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDirSystemTreeCtrl
CDirSystemTreeCtrl::CDirSystemTreeCtrl(CEdit* pEdit/*=NULL*/)
{
m_pMainDirEdit=pEdit;
}
CDirSystemTreeCtrl::~CDirSystemTreeCtrl()
{
m_imgList.Detach();
}
BEGIN_MESSAGE_MAP(CDirSystemTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CDirSystemTreeCtrl)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDirSystemTreeCtrl message handlers
BOOL CDirSystemTreeCtrl::DisplayTree()
{
DWORD dwStyle = GetStyle(); // read the windowstyle
if ( dwStyle & TVS_EDITLABELS )
{
// Don't allow the user to edit ItemLabels
ModifyStyle( TVS_EDITLABELS , 0 );
}
DeleteAllItems();
if ( !GetSysImgList() )
return FALSE;
DeleteAllItems();
char szDrives[128];
char* pDrive;
if ( !GetLogicalDriveStrings( sizeof(szDrives), szDrives ) )
{
m_strError = "Error Getting Logical DriveStrings!";
return FALSE;
}
pDrive = szDrives;
while( *pDrive )
{
HTREEITEM hParent = AddItem( TVI_ROOT, pDrive );
if ( FindSubDir( pDrive ) )
InsertItem( "", 0, 0, hParent );
pDrive += strlen( pDrive ) + 1;
}
return TRUE;
}
/////////////////////////////////////////////////
BOOL CDirSystemTreeCtrl::GetSysImgList()
{
SHFILEINFO shFinfo;
HIMAGELIST hImgList = NULL;
if ( GetImageList( TVSIL_NORMAL ) )
m_imgList.Detach();
hImgList = (HIMAGELIST)SHGetFileInfo( "C:\\",
0,
&shFinfo,
sizeof( shFinfo ),
SHGFI_SYSICONINDEX |
SHGFI_SMALLICON );
if ( !hImgList )
{
m_strError = "Cannot retrieve the Handle of SystemImageList!";
return FALSE;
}
m_imgList.m_hImageList = hImgList;
SetImageList( &m_imgList, TVSIL_NORMAL );
return TRUE;
}
void CDirSystemTreeCtrl::DisplayPath(HTREEITEM hParent, LPCTSTR strPath)
{
CFileFind find;
CString strPathFiles = strPath;
BOOL bFind;
CSortStringArray strDirArray;
CSortStringArray strFileArray;
if ( strPathFiles.Right(1) != "\\" )
strPathFiles += "\\";
strPathFiles += "*.*";
bFind = find.FindFile( strPathFiles );
while ( bFind )
{
bFind = find.FindNextFile();
if ( find.IsDirectory() && !find.IsDots() )
{
strDirArray.Add( find.GetFilePath() );
}
}
strDirArray.Sort();
SetRedraw( FALSE );
CWaitCursor wait;
for ( int i = 0; i < strDirArray.GetSize(); i++ )
{
HTREEITEM hItem = AddItem( hParent, strDirArray.GetAt(i) );
if ( FindSubDir( strDirArray.GetAt(i) ) )
InsertItem( "", 0, 0, hItem );
}
SetRedraw( TRUE );
}
HTREEITEM CDirSystemTreeCtrl::AddItem(HTREEITEM hParent, LPCTSTR strPath)
{
SHFILEINFO shFinfo;
int iIcon, iIconSel;
CString strTemp = strPath;
if ( strTemp.Right(1) != '\\' )
strTemp += "\\";
if ( !SHGetFileInfo( strTemp,
0,
&shFinfo,
sizeof( shFinfo ),
SHGFI_ICON |
SHGFI_SMALLICON ) )
{
m_strError = "Error Gettting SystemFileInfo!";
return NULL;
}
iIcon = shFinfo.iIcon;
DestroyIcon( shFinfo.hIcon );
if ( !SHGetFileInfo( strTemp,
0,
&shFinfo,
sizeof( shFinfo ),
SHGFI_ICON | SHGFI_OPENICON |
SHGFI_SMALLICON ) )
{
m_strError = "Error Gettting SystemFileInfo!";
return NULL;
}
iIconSel = shFinfo.iIcon;
DestroyIcon( shFinfo.hIcon );
if ( strTemp.Right(1) == "\\" )
strTemp.SetAt( strTemp.GetLength() - 1, '\0' );
if ( hParent == TVI_ROOT )
return InsertItem( strTemp, iIcon, iIconSel, hParent );
return InsertItem( GetSubPath( strTemp ), iIcon, iIconSel, hParent );
}
LPCTSTR CDirSystemTreeCtrl::GetSubPath(LPCTSTR strPath)
{
static CString strTemp;
int iPos;
strTemp = strPath;
if ( strTemp.Right(1) == '\\' )
strTemp.SetAt( strTemp.GetLength() - 1, '\0' );
iPos = strTemp.ReverseFind( '\\' );
if ( iPos != -1 )
strTemp = strTemp.Mid( iPos + 1);
return (LPCTSTR)strTemp;
}
BOOL CDirSystemTreeCtrl::FindSubDir( LPCTSTR strPath)
{
CFileFind find;
CString strTemp = strPath;
BOOL bFind;
if ( strTemp[strTemp.GetLength()-1] == '\\' )
strTemp += "*.*";
else
strTemp += "\\*.*";
bFind = find.FindFile( strTemp );
while ( bFind )
{
bFind = find.FindNextFile();
if ( find.IsDirectory() && !find.IsDots() )
{
return TRUE;
}
}
return FALSE;
}
void CDirSystemTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CString strPath;
if ( pNMTreeView->itemNew.state & TVIS_EXPANDED )
{
ExpandItem( pNMTreeView->itemNew.hItem, TVE_EXPAND );
}
else
{
HTREEITEM hChild = GetChildItem( pNMTreeView->itemNew.hItem );
while ( hChild )
{
DeleteItem( hChild );
hChild = GetChildItem( pNMTreeView->itemNew.hItem );
}
InsertItem( "", pNMTreeView->itemNew.hItem );
}
*pResult = 0;
}
CString CDirSystemTreeCtrl::GetFullPath(HTREEITEM hItem)
{
// get the Full Path of the item
CString strReturn;
CString strTemp;
HTREEITEM hParent = hItem;
strReturn = "";
while ( hParent )
{
strTemp = GetItemText( hParent );
strTemp += "\\";
strReturn = strTemp + strReturn;
hParent = GetParentItem( hParent );
}
strReturn.TrimRight( '\\' );
return strReturn;
}
BOOL CDirSystemTreeCtrl::SetSelPath(LPCTSTR strPath)
{
// Setting the Selection in the Tree
HTREEITEM hParent = TVI_ROOT;
int iLen = strlen(strPath) + 2;
char* pszPath = new char[iLen];
char* pPath = pszPath;
BOOL bRet = FALSE;
strcpy( pszPath, strPath );
strupr( pszPath );
if ( pszPath[strlen(pszPath)-1] != '\\' )
strcat( pszPath, "\\" );
int iLen2 = strlen( pszPath );
for (WORD i = 0; i < iLen2; i++ )
{
if ( pszPath[i] == '\\' )
{
SetRedraw( FALSE );
pszPath[i] = '\0';
hParent = SearchSiblingItem( hParent, pPath );
if ( !hParent ) // Not found!
break;
else
{
UINT uState;
uState = GetItemState( hParent, TVIS_EXPANDEDONCE );
if ( uState )
{
Expand( hParent, TVE_EXPAND );
Expand( hParent, TVE_COLLAPSE | TVE_COLLAPSERESET );
InsertItem("", hParent ); // insert a blank child-item
Expand( hParent, TVE_EXPAND ); // now, expand send a notification
}
else
Expand( hParent, TVE_EXPAND );
}
pPath += strlen(pPath) + 1;
}
}
delete [] pszPath;
if ( hParent ) // Ok the last subpath was found
{
SelectItem( hParent ); // select the last expanded item
bRet = TRUE;
}
else
{
bRet = FALSE;
}
SetRedraw( TRUE );
return bRet;
}
HTREEITEM CDirSystemTreeCtrl::SearchSiblingItem( HTREEITEM hItem, LPCTSTR strText)
{
HTREEITEM hFound = GetChildItem( hItem );
CString strTemp;
while ( hFound )
{
strTemp = GetItemText( hFound );
strTemp.MakeUpper();
if ( strTemp == strText )
return hFound;
hFound = GetNextItem( hFound, TVGN_NEXT );
}
return NULL;
}
void CDirSystemTreeCtrl::ExpandItem(HTREEITEM hItem, UINT nCode)
{
CString strPath;
if ( nCode == TVE_EXPAND )
{
HTREEITEM hChild = GetChildItem( hItem );
while ( hChild )
{
DeleteItem( hChild );
hChild = GetChildItem( hItem );
}
strPath = GetFullPath( hItem );
DisplayPath( hItem, strPath );
}
}
BOOL CDirSystemTreeCtrl::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
{
// TODO: Add your specialized code here and/or call the base class
return CTreeCtrl::OnAmbientProperty(pSite, dispid, pvar);
}
void CDirSystemTreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
m_pMainDirEdit->SetWindowText(GetFullPath(((NM_TREEVIEW*)pNMHDR)->itemNew.hItem));
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -