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

📄 filetreectrl.cpp

📁 版本更新了一下
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  if (m_bWinNT)
  {
    if (m_pNTShareInfo)
    {
      for (DWORD i=0; i<m_dwShares && !bShared; i++)
      {
        CString sShare((LPWSTR) m_pNTShareInfo[i].shi502_path);
        bShared = (sPath.CompareNoCase(sShare) == 0) && ((m_pNTShareInfo[i].shi502_type == STYPE_DISKTREE) || ((m_pNTShareInfo[i].shi502_type == STYPE_PRINTQ)));
      }
    }
  }  
  else
  {
    if (m_pWin9xShareInfo)
    {
      for (DWORD i=0; i<m_dwShares && !bShared; i++)
      {
        CString sShare(m_pWin9xShareInfo[i].shi50_path);
        bShared = (sPath.CompareNoCase(sShare) == 0) && 
                   ((m_pWin9xShareInfo[i].shi50_type == STYPE_DISKTREE) || ((m_pWin9xShareInfo[i].shi50_type == STYPE_PRINTQ)));
      }
    }
  }

  return bShared;
}







CTreeFileCtrlThreadInfo::CTreeFileCtrlThreadInfo() : m_TerminateEvent(FALSE, TRUE)
{
  m_pThread = NULL;
  m_pTree   = NULL;
  m_nIndex  = -1;
}

CTreeFileCtrlThreadInfo::~CTreeFileCtrlThreadInfo()
{
  delete m_pThread;
}




IMPLEMENT_DYNCREATE(CTreeFileCtrl, CTreeCtrl)

BEGIN_MESSAGE_MAP(CTreeFileCtrl, CTreeCtrl)
	//{{AFX_MSG_MAP(CTreeFileCtrl)
	ON_COMMAND(ID_TREEFILECTRL_PROPERTIES, OnProperties)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_PROPERTIES, OnUpdateProperties)
	ON_COMMAND(ID_TREEFILECTRL_RENAME, OnRename)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_RENAME, OnUpdateRename)
	ON_COMMAND(ID_TREEFILECTRL_OPEN, OnOpen)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_OPEN, OnUpdateOpen)
	ON_COMMAND(ID_TREEFILECTRL_DELETE, OnDelete)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_DELETE, OnUpdateDelete)
	ON_COMMAND(ID_TREEFILECTRL_REFRESH, OnRefresh)
	ON_COMMAND(ID_TREEFILECTRL_UPONELEVEL, OnUpOneLevel)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_UPONELEVEL, OnUpdateUpOneLevel)
	ON_WM_CONTEXTMENU()
	ON_WM_INITMENUPOPUP()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_TIMER()
	ON_COMMAND(ID_TREEFILECTRL_BACK, OnBack)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_BACK, OnUpdateBack)
	ON_COMMAND(ID_TREEFILECTRL_FORWARD, OnForward)
	ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_FORWARD, OnUpdateForward)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
	ON_WM_CONTEXTMENU()
	ON_NOTIFY_REFLECT_EX(NM_DBLCLK, OnDblclk)
	ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDING, OnItemExpanding)
	ON_NOTIFY_REFLECT_EX(TVN_BEGINLABELEDIT, OnBeginLabelEdit)
	ON_NOTIFY_REFLECT_EX(TVN_ENDLABELEDIT, OnEndLabelEdit)
	ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
	ON_NOTIFY_REFLECT_EX(TVN_BEGINDRAG, OnBeginDrag)
    ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnCustomDraw)
 	ON_NOTIFY_REFLECT_EX(TVN_SELCHANGED, OnSelChanged)
	ON_NOTIFY_REFLECT_EX(TVN_DELETEITEM, OnDeleteItem)
  ON_MESSAGE(WM_TREEUPDATE_CHANGE, OnChange)
END_MESSAGE_MAP()

CTreeFileCtrl::CTreeFileCtrl() : CTreeCtrl()
{
  m_sFileNameMask = _T("*.*");
  m_dwFileHideFlags = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | 
                      FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_TEMPORARY;
  m_bShowCompressedUsingDifferentColor = TRUE;
  m_rgbCompressed = RGB(0, 0, 255);
  m_bShowEncryptedUsingDifferentColor = TRUE;
  m_rgbEncrypted = RGB(255, 0, 0);
  m_dwDriveHideFlags = 0;
  m_bShowFiles = TRUE;
  m_pilDrag = NULL;
  m_hItemDrag = NULL;
  m_hItemDrop = NULL;
  m_hNetworkRoot = NULL;
  m_TimerTicks = 0;
  m_bAllowDragDrop = FALSE;
  m_bAllowRename = FALSE;
  m_bAllowOpen = TRUE;
  m_bAllowProperties = TRUE;
  m_bAllowDelete = FALSE;
  m_nMaxHistory = 20;
  m_bUpdatingHistorySelection = FALSE;
  m_bAutoRefresh = TRUE;
  m_bShowSharedUsingDifferentIcon = TRUE;
  m_nTimerID = 0;
  for (int i=0; i<26; i++)
    m_dwMediaID[i] = 0xFFFFFFFF;

  m_pMalloc = NULL;
  m_pShellFolder = NULL;
  m_bDisplayNetwork = TRUE;
  m_FileExtensions = UseTheShellSetting;
  m_dwNetworkItemTypes = RESOURCETYPE_ANY;
  m_hMyComputerRoot = NULL;
  m_bShowMyComputer = TRUE;
  m_bShowRootedFolder = FALSE;
  m_hRootedFolder = NULL;
  m_bShowDriveLabels = TRUE;
}

CTreeFileCtrl::~CTreeFileCtrl()
{
}

int CTreeFileCtrl::CompareByFilenameNoCase(CString& element1, CString& element2) 
{
  return element1.CompareNoCase(element2);
}

#ifdef _DEBUG
void CTreeFileCtrl::AssertValid() const
{
	CTreeCtrl::AssertValid();
}

void CTreeFileCtrl::Dump(CDumpContext& dc) const
{
	CTreeCtrl::Dump(dc);
}
#endif //_DEBUG

void CTreeFileCtrl::SetShowFiles(BOOL bFiles) 
{ 
  m_bShowFiles = bFiles; 

  //Force a refresh
  Refresh();
}

void CTreeFileCtrl::SetRootFolder(const CString& sPath)
{
  m_sRootFolder = sPath;

  //Ensure it is terminated with a "\"
  int nLength = m_sRootFolder.GetLength();
  if (nLength && m_sRootFolder.GetAt(nLength-1) != _T('\\'))
    m_sRootFolder += _T('\\');

  //Force a refresh
  Refresh();
}

int CTreeFileCtrl::GetIconIndex(HTREEITEM hItem)
{
  TV_ITEM tvi;
  ZeroMemory(&tvi, sizeof(TV_ITEM));
  tvi.mask = TVIF_IMAGE;
  tvi.hItem = hItem;
  if (GetItem(&tvi))
    return tvi.iImage;
  else
    return -1;
}

int CTreeFileCtrl::GetIconIndex(const CString& sFilename)
{
  //Retreive the icon index for a specified file/folder
  SHFILEINFO sfi;
  ZeroMemory(&sfi, sizeof(SHFILEINFO));
  SHGetFileInfo(sFilename, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
  return sfi.iIcon; 
}

int CTreeFileCtrl::GetSelIconIndex(const CString& sFilename)
{
  //Retreive the icon index for a specified file/folder
  SHFILEINFO sfi;
  ZeroMemory(&sfi, sizeof(SHFILEINFO));
  SHGetFileInfo(sFilename, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_OPENICON | SHGFI_SMALLICON);
  return sfi.iIcon; 
}

int CTreeFileCtrl::GetIconIndex(LPITEMIDLIST lpPIDL)
{
  SHFILEINFO sfi;
  ZeroMemory(&sfi, sizeof(SHFILEINFO));
  SHGetFileInfo((LPCTSTR)lpPIDL, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_LINKOVERLAY);
  return sfi.iIcon; 
}

int CTreeFileCtrl::GetSelIconIndex(LPITEMIDLIST lpPIDL)
{
  SHFILEINFO sfi;
  ZeroMemory(&sfi, sizeof(SHFILEINFO));
  SHGetFileInfo((LPCTSTR)lpPIDL, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
  return sfi.iIcon; 
}

int CTreeFileCtrl::GetSelIconIndex(HTREEITEM hItem)
{
  TV_ITEM tvi;
  ZeroMemory(&tvi, sizeof(TV_ITEM));
  tvi.mask = TVIF_SELECTEDIMAGE;
  tvi.hItem = hItem;
  if (GetItem(&tvi))
    return tvi.iSelectedImage;
  else
    return -1;
}

HTREEITEM CTreeFileCtrl::FindSibling(HTREEITEM hParent, const CString& sItem) const
{
  HTREEITEM hChild = GetChildItem(hParent);
  while (hChild)
  {
    CTreeFileCtrlItemInfo* pItem = (CTreeFileCtrlItemInfo*) GetItemData(hChild);
    ASSERT(pItem);
    if (pItem->m_sRelativePath.CompareNoCase(sItem) == 0)
      return hChild;
    hChild = GetNextItem(hChild, TVGN_NEXT);
  }
  return NULL;
}

CString CTreeFileCtrl::GetSelectedPath()
{
  HTREEITEM hItem = GetSelectedItem();
  if (hItem)
    return ItemToPath(hItem);
  else
    return CString();
}

HTREEITEM CTreeFileCtrl::FindServersNode(HTREEITEM hFindFrom) const
{
  if (m_bDisplayNetwork)
  {
    //Try to find some "servers" in the child items of hFindFrom
    HTREEITEM hChild = GetChildItem(hFindFrom);
    while (hChild)
    {
      CTreeFileCtrlItemInfo* pItem = (CTreeFileCtrlItemInfo*) GetItemData(hChild);
      ASSERT(pItem);
      if (pItem->m_pNetResource)
      {
        //Found a share 
        if (pItem->m_pNetResource->dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
          return hFindFrom;
      }
 
      //Get the next sibling for the next loop around
      hChild = GetNextSiblingItem(hChild);
    }

    //Ok, since we got here, we did not find any servers in any of the child nodes of this 
    //item. In this case we need to call ourselves recursively to find one
    hChild = GetChildItem(hFindFrom);
    while (hChild)
    {
      HTREEITEM hFound = FindServersNode(hChild);
      if (hFound)
        return hFound;
       
      //Get the next sibling for the next loop around
      hChild = GetNextSiblingItem(hChild);
    }
  }

  //If we got as far as here then no servers were found.
  return NULL;
}

void CTreeFileCtrl::SetHasPlusButton(HTREEITEM hItem, BOOL bHavePlus)
{
  //Remove all the child items from the parent
  TV_ITEM tvItem;
  tvItem.hItem = hItem;
  tvItem.mask = TVIF_CHILDREN;  
  tvItem.cChildren = bHavePlus;
  SetItem(&tvItem);
}

BOOL CTreeFileCtrl::HasPlusButton(HTREEITEM hItem)
{
  TVITEM tvItem;
  tvItem.hItem = hItem;
  tvItem.mask = TVIF_HANDLE | TVIF_CHILDREN;
  return GetItem(&tvItem) && (tvItem.cChildren != 0);
}

HTREEITEM CTreeFileCtrl::SetSelectedPath(const CString& sPath, BOOL bExpanded)
{
  CString sSearch(sPath);
  int nSearchLength = sSearch.GetLength();
  if (nSearchLength == 0)
  {
    TRACE(_T("Cannot select a empty path\n"));
    return NULL;
  }

  //Remove trailing "\" from the path
  if (nSearchLength > 3 && sSearch.GetAt(nSearchLength-1) == _T('\\'))
    sSearch = sSearch.Left(nSearchLength-1);
  
  //Remove initial part of path if the root folder is setup
  int nRootLength = m_sRootFolder.GetLength();
  if (nRootLength)
  {
    if (sSearch.Find(m_sRootFolder) != 0)
    {
      TRACE(_T("Could not select the path %s as the root has been configued as %s\n"), sPath, m_sRootFolder);
      return NULL;
    }
    sSearch = sSearch.Right(sSearch.GetLength() - nRootLength);
  }

  if (sSearch.IsEmpty())
    return NULL;

  SetRedraw(FALSE);

  HTREEITEM hItemFound = TVI_ROOT;
  if (nRootLength && m_hRootedFolder)
    hItemFound = m_hRootedFolder;
  BOOL bDriveMatch = m_sRootFolder.IsEmpty();
  BOOL bNetworkMatch = m_bDisplayNetwork && ((sSearch.GetLength() > 2) && sSearch.Find(_T("\\\\")) == 0);
  if (bNetworkMatch)
  {
    bDriveMatch = FALSE;

    //Working here
    BOOL bHasPlus = HasPlusButton(m_hNetworkRoot);
    BOOL bHasChildren = (GetChildItem(m_hNetworkRoot) != NULL);

    if (bHasPlus && !bHasChildren)
      DoExpand(m_hNetworkRoot);
    else
      Expand(m_hNetworkRoot, TVE_EXPAND);
    hItemFound = FindServersNode(m_hNetworkRoot);
    sSearch = sSearch.Right(sSearch.GetLength() - 2);
  }
  if (bDriveMatch)
  {
    if (m_hMyComputerRoot)
    {
      //Working here
      BOOL bHasPlus = HasPlusButton(m_hMyComputerRoot);
      BOOL bHasChildren = (GetChildItem(m_hMyComputerRoot) != NULL);

      if (bHasPlus && !bHasChildren)
        DoExpand(m_hMyComputerRoot);
      else
        Expand(m_hMyComputerRoot, TVE_EXPAND);
      hItemFound = m_hMyComputerRoot;
    }
  }

  int nFound = sSearch.Find(_T('\\'));
  while (nFound != -1)
  {
    CString sMatch;
    if (bDriveMatch)
    {
      sMatch = sSearch.Left(nFound + 1);
      bDriveMatch = FALSE;
    }
    else
      sMatch = sSearch.Left(nFound);
    
    hItemFound = FindSibling(hItemFound, sMatch);
    if (hItemFound == NULL)
      break;
    else if (!IsDrive(sPath))
    {
      SelectItem(hItemFound);

      //Working here
      BOOL bHasPlus = HasPlusButton(hItemFound);
      BOOL bHasChildren = (GetChildItem(hItemFound) != NULL);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -