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

📄 apptreec.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "stdafx.h"
#include "apptreec.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#pragma warning ( disable : 4711 )
/////////////////////////////////////////////////////////////////////////////
// CAppTreeCtrl

CAppTreeCtrl::CAppTreeCtrl ()
{
}

CAppTreeCtrl:: ~ CAppTreeCtrl ()
{
}

void CAppTreeCtrl::
CheckSelection ()
{
  POSITION pos = GetFirstSelectedItemPosition (), oldpos;
  HTREEITEM hItem;
  TVITEM item;
  item.mask = TVIF_HANDLE|TVIF_PARAM;
  while (pos)
    {
      oldpos = pos;
      hItem = GetNextSelectedItem (pos);
      if (!GetItem (&item))
        {
          m_listSelected.RemoveAt (oldpos);
        }
    }
}

/* it's too time consuming
void CAppTreeCtrl::
RemoveState (HTREEITEM hItem, LPARAM lParam)
{
  if (GetItemState (hItem, lParam) & lParam)
    {
      SetItemState (hItem, 0, lParam);
    }
}
 */

void CAppTreeCtrl::
ClearSelection ()
{
  /* it's too time consuming
  ProcessItemsBefore (RemoveState, TVI_ROOT, TVIS_SELECTED, FALSE);
   */
  POSITION pos = GetFirstSelectedItemPosition ();
  HTREEITEM hItem;
  while (pos)
    {
      hItem = GetNextSelectedItem (pos);
      SetItemState (hItem, 0, TVIS_SELECTED);
    }
  m_listSelected.RemoveAll ();
}

void CAppTreeCtrl::
ClearSelectionBut (HTREEITEM hButItem)
{
  POSITION pos = GetFirstSelectedItemPosition ();
  HTREEITEM hItem;
  while (pos)
    {
      hItem = GetNextSelectedItem (pos);
      if (hButItem != hItem)
      {
        SetItemState (hItem, 0, TVIS_SELECTED);
      }
    }
  m_listSelected.RemoveAll ();
  m_listSelected.AddTail (hButItem);
}

UINT CAppTreeCtrl::
GetSelectedCount () const
{
  return m_listSelected.GetCount ();
}

POSITION CAppTreeCtrl::
GetFirstSelectedItemPosition () const
{
  return m_listSelected.GetHeadPosition ();
}

HTREEITEM CAppTreeCtrl::
GetNextSelectedItem(POSITION &pos) const
{
  ASSERT (pos);
  return m_listSelected.GetNext (pos);
}

/*
  hEnd == 0 - searching for the beginning of the selection
  hEnd == 1 - selecting and searching for the beginning
              of the selection
  hEnd == 2 - selecting and searching for the end of the selection
              by the last selected item
  hEnd == 3 - searching for the end of the selection
  hEnd == 4 - clearing the rest
 */
void CAppTreeCtrl::
SetSelectedTo (HTREEITEM hItem, LPARAM lParam)
{
  if (((HTREEITEM2X*) lParam)->hEnd == (HTREEITEM) 4)
    {
      if (GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED)
        {
          SetItemState (hItem, 0, TVIS_SELECTED);
          m_listSelected.RemoveAt (m_listSelected.Find(hItem));
        }
    }
  else
    {
      switch ((DWORD) ((HTREEITEM2X*) lParam)->hEnd)
        {
        case 0:
          if (hItem == ((HTREEITEM2X*) lParam)->hBegin)
            {
              ((HTREEITEM2X*) lParam)->hEnd = (HTREEITEM) 1;
              if (!(GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED))
                {
                  SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED);
                  m_listSelected.AddTail (hItem);
                }
            }
          else if (GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED)
            {
              ((HTREEITEM2X*) lParam)->hEnd = (HTREEITEM) 2;
            }
          break;
        case 1:
          if (GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED)
            {
              // only to leave all selection under top-first item
              // ((HTREEITEM2X*) lParam)->hEnd = (HTREEITEM) 3;
              ((HTREEITEM2X*) lParam)->hEnd = (HTREEITEM) 4;
            }
          else
            {
              SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED);
              m_listSelected.AddTail (hItem);
            }
          break;
        case 2:
          if (!(GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED))
            {
              SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED);
              m_listSelected.AddTail (hItem);
            }
          if (hItem == ((HTREEITEM2X*) lParam)->hBegin)
            {
              ((HTREEITEM2X*) lParam)->hEnd = (HTREEITEM) 4;
            }
          break;
        case 3:
          if (!(GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED))
            {
              ((HTREEITEM2X*) lParam)->hEnd = (HTREEITEM) 4;
            }
          break;
        default:
          ASSERT (FALSE);
        }
    }
}

void CAppTreeCtrl::
SelectTo (HTREEITEM hItem)
{
  if (GetSelectedCount ())
    {
      if (hItem == m_listSelected.GetHead ())
        {
          ClearSelectionBut (hItem);
        }
      else
        {
          HTREEITEM2X items;
          items.hBegin = hItem;
          items.hEnd = (HTREEITEM) 0;
          ProcessItemsInOrder (SetSelectedTo, TVI_ROOT, (LPARAM) &items, FALSE);
        }
    }
  else
    {
      SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED);
      m_listSelected.AddTail (hItem);
    }
}

void CAppTreeCtrl::
AddToList (HTREEITEM hItem, LPARAM lParam)
{
  if (!((CList<HTREEITEM, HTREEITEM>*) lParam)->Find (hItem))
    {
      ((CList<HTREEITEM, HTREEITEM>*) lParam)->AddTail (hItem);
    }
}

int CAppTreeCtrl::
GetChildren (HTREEITEM hItem, CList<HTREEITEM, HTREEITEM> &list, BOOL bSelf)
{
  int nCount = list.GetCount ();
  ProcessItemsInOrder (AddToList, hItem, (LPARAM) &list, bSelf);
  return list.GetCount () - nCount;
}

BOOL CAppTreeCtrl::
EqualItem (TVITEM * pItem, LPCTSTR text, int image, LPARAM lParam, UINT mask)
{
  if (GetItem (pItem))
    {
      if (mask & TVIF_TEXT && _tcsicmp (text, pItem->pszText))
        return FALSE;
      if (mask & TVIF_IMAGE && image != pItem->iImage)
        return FALSE;
      if (mask & TVIF_PARAM && lParam != pItem->lParam)
        return FALSE;
      return TRUE;
    }
  return FALSE;
}

bool CAppTreeCtrl::
FindFirstItemAfter (bool (CAppTreeCtrl:: * FindFirstItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  HTREEITEM hParent = hItem;
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      if ((this->*FindFirstItem) (hItem, lParam))
        {
          return true;
        }
    }
  if (bSelf)
    {
      return (this->*FindFirstItem) (hParent, lParam);
    }
  return false;
}

bool CAppTreeCtrl::
FindFirstItemBack (bool (CAppTreeCtrl:: * FindFirstItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  if (bSelf)
    {
      if ((this->*FindFirstItem) (hItem, lParam))
        {
          return true;
        }
    }
  while ((hItem = GetParentItem (hItem)) != NULL)
    {
      if ((this->*FindFirstItem) (hItem, lParam))
        {
          return true;
        }
    }
  return false;
}

bool CAppTreeCtrl::
FindFirstItemBefore (bool (CAppTreeCtrl:: * FindFirstItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  if (bSelf)
    {
      if ((this->*FindFirstItem) (hItem, lParam))
        {
          return true;
        }
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      if ((this->*FindFirstItem) (hItem, lParam))
        {
          return true;
        }
    }
  return false;
}

bool CAppTreeCtrl::
FindFirstItemInOrder (bool (CAppTreeCtrl:: * FindFirstItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  if (bSelf)
    {
      if ((this->*FindFirstItem) (hItem, lParam))
        {
          return true;
        }
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      if (FindFirstItemInOrder (FindFirstItem, hItem, lParam, TRUE))
        {
          return true;
        }
    }
  return false;
}

⌨️ 快捷键说明

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