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

📄 apptreec.cpp

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

bool CAppTreeCtrl::
FindFirstItemPostOrder (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 (FindFirstItemPostOrder (FindFirstItem, hItem, lParam, TRUE))
        {
          return true;
        }
    }
  if (bSelf)
    {
      return (this->*FindFirstItem) (hParent, lParam);
    }
  return false;
}

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

HTREEITEM CAppTreeCtrl::
FindItem (HTREEITEM hItem, LPCTSTR text, int image, LPARAM lParam, UINT mask, BOOL bSelf)
{
  TVITEM item;
  TCHAR buffer[32];

  item.mask = mask;
  if (mask & TVIF_TEXT)
    {
      item.pszText = buffer;
      item.cchTextMax = countof (buffer);
    }
  if (bSelf)
    {
      item.hItem = hItem;
      if (EqualItem (&item, text, image, lParam, mask))
        {
          return hItem;
        }
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      item.hItem = hItem;
      if (EqualItem (&item, text, image, lParam, mask))
        {
          return hItem;
        }
    }
  return NULL;
}

HTREEITEM CAppTreeCtrl::
FindItemRecursive (HTREEITEM hItem, LPCTSTR text, int image, LPARAM lParam, UINT mask, BOOL bSelf)
{
  HTREEITEM hChild;
  TVITEM item;
  TCHAR buffer[32];

  item.mask = mask;
  if (mask & TVIF_TEXT)
    {
      item.pszText = buffer;
      item.cchTextMax = countof (buffer);
    }
  if (bSelf)
    {
      item.hItem = hItem;
      if (EqualItem (&item, text, image, lParam, mask))
        {
          return hItem;
        }
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      hChild = FindItemRecursive (hItem, text, image, lParam, mask, TRUE);
      if (hChild)
        {
          return hChild;
        }
    }
  return NULL;
}

int CAppTreeCtrl::
GetItemLevel (HTREEITEM hItem)
{
  int nLevel = 0;

  while ((hItem = GetParentItem (hItem)) != NULL)
    {
      nLevel++;
    }
  return nLevel;
}

int CAppTreeCtrl::
GetItemCount (HTREEITEM hItem)
{
  int nCount = 0;

  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      nCount++;
    }
  return nCount;
}

int CAppTreeCtrl::
GetItemCountRecursive (HTREEITEM hItem)
{
  int nCount = 0;

  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      nCount += GetItemCountRecursive (hItem) + 1;
    }
  return nCount;
}

BOOL CAppTreeCtrl::
DataNotEqual (HTREEITEM hItem, LPARAM lParam)
{
  return GetItemData (hItem) != (DWORD) lParam;
}

int CAppTreeCtrl::
GetTrueItemCount (BOOL (CAppTreeCtrl:: * IsTrue) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  int nCount = 0;

  if (bSelf)
    {
      if ((this->*IsTrue) (hItem, lParam))
        {
          nCount++;
        }
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      if ((this->*IsTrue) (hItem, lParam))
        {
          nCount++;
        }
    }
  return nCount;
}

int CAppTreeCtrl::
GetTrueItemCountRecursive (BOOL (CAppTreeCtrl:: * IsTrue) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  int nCount = 0;

  if (bSelf)
    {
      if ((this->*IsTrue) (hItem, lParam))
        {
          nCount++;
        }
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      nCount += GetTrueItemCountRecursive (IsTrue, hItem, lParam, TRUE);
    }
  return nCount;
}

void CAppTreeCtrl::
ProcessItemsAfter (void (CAppTreeCtrl:: * ProcessItem) (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))
    {
      (this->*ProcessItem) (hItem, lParam);
    }
  if (bSelf)
    {
      (this->*ProcessItem) (hParent, lParam);
    }
}

void CAppTreeCtrl::
ProcessItemsBack (void (CAppTreeCtrl:: * ProcessItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  if (bSelf)
    {
      (this->*ProcessItem) (hItem, lParam);
    }
  while ((hItem = GetParentItem (hItem)) != NULL)
    {
      (this->*ProcessItem) (hItem, lParam);
    }
}

void CAppTreeCtrl::
ProcessItemsBefore (void (CAppTreeCtrl:: * ProcessItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  if (bSelf)
    {
      (this->*ProcessItem) (hItem, lParam);
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      (this->*ProcessItem) (hItem, lParam);
    }
}

void CAppTreeCtrl::
ProcessItemsInOrder (void (CAppTreeCtrl:: * ProcessItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  if (bSelf)
    {
      (this->*ProcessItem) (hItem, lParam);
    }
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      ProcessItemsInOrder (ProcessItem, hItem, lParam, TRUE);
    }
}

void CAppTreeCtrl::
ProcessItemsPostOrder (void (CAppTreeCtrl:: * ProcessItem) (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))
    {
      ProcessItemsPostOrder (ProcessItem, hItem, lParam, TRUE);
    }
  if (bSelf)
    {
      (this->*ProcessItem) (hParent, lParam);
    }
}

void CAppTreeCtrl::
ProcessItemsPreOrder (void (CAppTreeCtrl:: * ProcessItem) (HTREEITEM hItem, LPARAM lParam), HTREEITEM hItem, LPARAM lParam, BOOL bSelf)
{
  ProcessItemsBefore (ProcessItem, hItem, lParam, bSelf);
  for (hItem = GetNextItem (hItem, TVGN_CHILD); hItem; hItem = GetNextItem (hItem, TVGN_NEXT))
    {
      ProcessItemsPreOrder (ProcessItem, hItem, lParam, FALSE);
    }
}

void CAppTreeCtrl::
Paint (void)
{
  RedrawWindow ();
}

BEGIN_MESSAGE_MAP (CAppTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CAppTreeCtrl)
ON_WM_CREATE ()
//}}AFX_MSG_MAP
END_MESSAGE_MAP ()

/////////////////////////////////////////////////////////////////////////////
// CAppTreeCtrl message handlers

int CAppTreeCtrl::OnCreate (LPCREATESTRUCT lpCreateStruct)
{
  if (CTreeCtrl::OnCreate (lpCreateStruct) == -1)
    return -1;

  return 0;
}

BOOL CAppTreeCtrl::
PreTranslateMessage (MSG * pMsg)
{
  if (!GetEditControl () && pMsg->message == WM_KEYDOWN)
    {
      if (pMsg->wParam == VK_ESCAPE)
        {
          CWnd *w = AfxGetMainWnd ();

          w->SetForegroundWindow ();
          w->SetFocus ();
          return TRUE;
        }
      else if (pMsg->wParam == VK_F2)
        {
          HTREEITEM hItem = GetSelectedItem ();

          if (hItem)
            {
              EditLabel (hItem);
            }
        }
    }
  return CTreeCtrl::PreTranslateMessage (pMsg);
}

/////////////////////////////////////////////////////////////////////////////
#pragma warning ( default : 4711 )

⌨️ 快捷键说明

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