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

📄 prjtreec.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      else
        {
          dc.SetTextColor (::GetSysColor (COLOR_WINDOWTEXT));
          dc.SetBkColor (::GetSysColor (COLOR_WINDOW));
        }
      if (!m_ext.IsEmpty ())
        {
          POSITION pos = m_ext.GetHeadPosition ();
          int left;
          dc.SelectObject (&pen2);
          do
            {
              left = m_ext.GetNext (pos);
              if (left != rc.left)
                {
                  dc.MoveTo (left - 10, rc.top);
                  dc.LineTo (left - 10, rc.bottom);
                }
            }
          while (pos);
        }
      if (GetNextItem (hItem, TVGN_CHILD))
        {
          dc.SelectObject (&pen1);
          dc.Rectangle (rc.left - 14, rc.top + 4, rc.left - 5, rc.top + 13);
          dc.SelectObject (&pen2);
          dc.MoveTo (rc.left - 5, rc.top + 8);
          dc.LineTo (rc.left, rc.top + 8);
          dc.MoveTo (rc.left - 10, rc.top);
          dc.LineTo (rc.left - 10, rc.top + 4);
          if (GetNextItem (hItem, TVGN_NEXT))
            {
              dc.MoveTo (rc.left - 10, rc.top + 13);
              dc.LineTo (rc.left - 10, rc.bottom);
              if (!m_ext.Find (rc.left))
                {
                  m_ext.AddTail (rc.left);
                }
            }
          else
            {
              POSITION pos = m_ext.Find (rc.left);
              if (pos)
                {
                  m_ext.RemoveAt (pos);
                }
            }
          dc.SelectObject (&pen3);
          dc.MoveTo (rc.left - 12, rc.top + 8);
          dc.LineTo (rc.left - 7, rc.top + 8);
          if (!(state & TVIS_EXPANDED))
            {
              dc.MoveTo (rc.left - 10, rc.top + 6);
              dc.LineTo (rc.left - 10, rc.top + 11);
            }
        }
      else
        {
          dc.SelectObject (&pen2);
          dc.MoveTo (rc.left - 10, rc.top + 8);
          dc.LineTo (rc.left, rc.top + 8);
          if (GetNextItem (hItem, TVGN_NEXT))
            {
              dc.MoveTo (rc.left - 10, rc.top);
              dc.LineTo (rc.left - 10, rc.bottom);
              if (!m_ext.Find (rc.left))
                {
                  m_ext.AddTail (rc.left);
                }
            }
          else
            {
              dc.MoveTo (rc.left - 10, rc.top);
              dc.LineTo (rc.left - 10, rc.top + 8);
              POSITION pos = m_ext.Find (rc.left);
              if (pos)
                {
                  m_ext.RemoveAt (pos);
                }
            }
        }
      int iImage, iSelectedImage;
      VERIFY (GetItemImage (hItem, iImage, iSelectedImage));
      m_objStatusImages.Draw (&dc, iImage, rc.TopLeft (), ILD_TRANSPARENT);
      rc.left += ICON_WIDTH;
      rc.right += ICON_WIDTH;
      dc.ExtTextOut (rc.left + TEXT_DELTA, rc.top + 1, ETO_OPAQUE, rc, sItem, NULL);
      if (state & TVIS_SELECTED)
        {
          dc.DrawFocusRect (rc);
        }
      if (state & TVIS_SELECTED)
        {
          dc.SetTextColor (::GetSysColor (COLOR_WINDOWTEXT));
          dc.SetBkColor (::GetSysColor (COLOR_WINDOW));
        }

      if (m_dwLayout & PRJTREEC_SHOWDESC)
        {
          LPTSTR str = sText.GetBuffer (_tcslen (_T ("DUMMY")) + 1);
          _tcscpy (str, _T ("DUMMY"));
          _tcslwr (str + 1);
          sText.ReleaseBuffer ();
          if (m_dwLayout & PRJTREEC_TABBEDCOLS)
            {
              rc.left = rc1.left;
              rc.right = rc1.right;
            }
          else
            {
              rc.left = rc.right + TEXT_DELTA;
              rc.right = (long) (rc.left + dc.GetTextExtent (sText).cx + (TEXT_DELTA << 1) + 1);
            }
          dc.ExtTextOut (rc.left + TEXT_DELTA, rc.top + 1, ETO_OPAQUE, rc, sText, NULL);
        }
      hItem = GetNextVisibleItem (hItem);
    }
  dc.SelectObject (pOldPen);
  pen1.DeleteObject ();
  pen2.DeleteObject ();
  pen3.DeleteObject ();
  dc.SelectObject (pOldFont);
  normal.DeleteObject ();*/
}

void CProjectTreeCtrl::
OnLButtonDblClk (UINT nFlags, CPoint point)
{
  /*UINT nFlags2;
  HTREEITEM hItem;
  hItem = HitTest (point, &nFlags2);
  KillTimer (1);
  m_bDblClk = true;
  CAppTreeCtrl::OnLButtonDblClk (nFlags, point);
  OnTimer (1);*/
  if (m_hPointedItem)
    {
      //EditLabel (m_hPointedItem);
      CProjectItem *pItem = (CProjectItem*) GetItemData (m_hPointedItem);
      if (pItem && (pItem->dwType & PI_FILE))
        {
          ASSERT (g_pProject);
          CString sPath = g_pProject->MakePath (pItem);
          AfxGetMainWnd ()->SendMessage (WM_OPEN_HERE, 0, (LPARAM) (LPCTSTR) sPath);
        }
      else
        {
          if (pItem && !pItem->lstItems.IsEmpty ())
            ExpandItem (m_hPointedItem, TVE_TOGGLE);
        }
      CWnd *pWnd = AfxGetMainWnd ();
      pWnd->SetForegroundWindow ();
      pWnd->SetFocus ();
    }
  CWnd *pWnd = AfxGetMainWnd ();
  pWnd->SetForegroundWindow ();
  pWnd->SetFocus ();
}

void CProjectTreeCtrl::
OnLButtonDown (UINT nFlags, CPoint point)
{
  UINT nFlags2;
  m_hPointedItem = HitTest (point, &nFlags2);
  /*KillTimer (1);
  m_bDblClk = false;*/
  if (m_hPointedItem && (nFlags2 & (TVHT_ONITEMICON|TVHT_ONITEMLABEL)))
    {
      if (GetFocus () != this)
        {
          SetFocus ();
        }
      return;
    }
  CAppTreeCtrl::OnLButtonDown (nFlags, point);
}

void CProjectTreeCtrl::
OnLButtonUp (UINT nFlags, CPoint point)
{
  UINT nFlags2;
  HTREEITEM hItem = HitTest (point, &nFlags2);

  if (hItem == m_hPointedItem && (nFlags2 & (TVHT_ONITEMICON | TVHT_ONITEMLABEL)))
    {
      if (GetItemState (hItem, TVIS_SELECTED) & TVIS_SELECTED)
        {
          if (nFlags & MK_SHIFT)
            {
              SelectTo (hItem);
            }
          else if (nFlags & MK_CONTROL)
            {
              SetItemState (hItem, 0, TVIS_SELECTED);
              m_listSelected.RemoveAt (m_listSelected.Find(hItem));
            }
          /*else if (!m_bDblClk)
            {
              SetTimer (1, GetDoubleClickTime (), NULL);
            }*/
        }
      else
        {
          if (nFlags & MK_SHIFT)
            {
              SelectTo (hItem);
            }
          else
            {
              if (nFlags & MK_CONTROL)
                {
                  SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED);
                  m_listSelected.AddTail (hItem);
                }
              else
                {
                  ClearSelection ();
                  SetItemState (hItem, TVIS_SELECTED, TVIS_SELECTED);
                  m_listSelected.AddTail (hItem);
                }
            }
        }
      CWnd *pWnd = AfxGetMainWnd ();
      pWnd->SetForegroundWindow ();
      pWnd->SetFocus ();
      return;
    }
  CAppTreeCtrl::OnLButtonUp (nFlags, point);
  CWnd *pWnd = AfxGetMainWnd ();
  pWnd->SetForegroundWindow ();
  pWnd->SetFocus ();
}

void CProjectTreeCtrl::
OnDestroy ()
{
  if (m_dwLayout & PRJTREEC_HEADER)
    {
      LPCTSTR pszName = REGISTRY_ROOT _T ("ProjectTree");
      HDITEM item;
      item.mask = HDI_WIDTH;
      if (m_ctlHeader.GetItem (0, &item))
        {
          RegSaveNumber (HKEY_CURRENT_USER, pszName, _T ("Description"), item.cxy);
        }
      if (m_ctlHeader.GetItem (1, &item))
        {
          RegSaveNumber (HKEY_CURRENT_USER, pszName, _T ("Name"), item.cxy);
        }
      m_ctlHeader.DestroyWindow ();
    }
  CAppTreeCtrl::OnDestroy ();
}

/*LONG CProjectTreeCtrl::
OnHitTest (WPARAM wParam, LPARAM lParam)
{
  LONG lResult = DefWindowProc (TVM_HITTEST, wParam, lParam);
  LPTVHITTESTINFO pHitTestInfo = (LPTVHITTESTINFO) lParam;

  if (pHitTestInfo->hItem)
    {
      CClientDC dc (this);
      CRect rc;
      GetItemRect (pHitTestInfo->hItem, &rc, TRUE);
      rc.right++;
      UINT state = GetItemState (pHitTestInfo->hItem, TVIS_SELECTED);
      pHitTestInfo->flags = 0;
      if (pHitTestInfo->pt.x > rc.left - ICON_WIDTH && pHitTestInfo->pt.x < rc.left)
        {
          pHitTestInfo->flags |= TVHT_ONITEMBUTTON;
        }
      int delta = STATUS_WIDTH;
      if (pHitTestInfo->pt.x > rc.left && pHitTestInfo->pt.x < rc.left + delta)
        {
          pHitTestInfo->flags |= TVHT_ONITEMICON;
          if ((pHitTestInfo->pt.x - rc.left) / ICON_WIDTH == 0)
            {
              pHitTestInfo->flags |= TVHT_ONITEMICON1;
            }
        }
      rc.left += delta;
      rc.right += delta;
      if (pHitTestInfo->pt.x > rc.left && pHitTestInfo->pt.x < rc.right)
        {
          pHitTestInfo->flags |= TVHT_ONITEMLABEL;
        }
      if (pHitTestInfo->pt.x > rc.right)
        {
          pHitTestInfo->flags |= TVHT_ONITEMRIGHT;
        }
    }
  return lResult;
}*/

/*void CProjectTreeCtrl::
OnTimer (UINT nIDEvent)
{
  KillTimer (1);
  if (m_hPointedItem)
    {
      //EditLabel (m_hPointedItem);
      CProjectItem *pItem = (CProjectItem*) GetItemData (m_hPointedItem);
      if (pItem && (pItem->dwType & PI_FILE))
        {
          ASSERT (g_pProject);
          CString sPath = g_pProject->MakePath (pItem);
          AfxGetMainWnd ()->SendMessage (WM_OPEN_HERE, 0, (LPARAM) (LPCTSTR) sPath);
        }
      else
        {
          if (pItem && !pItem->lstItems.IsEmpty ())
            ExpandItem (m_hPointedItem, TVE_TOGGLE);
        }
      CWnd *pWnd = AfxGetMainWnd ();
      pWnd->SetForegroundWindow ();
      pWnd->SetFocus ();
    }
  CAppTreeCtrl::OnTimer (nIDEvent);
}*/

void CProjectTreeCtrl::
OnSize (UINT nType, int cx, int cy)
{
  CAppTreeCtrl::OnSize (nType, cx, cy);
  if (m_dwLayout & PRJTREEC_HEADER)
    {
      CRect rc;
      m_ctlHeader.GetWindowRect (rc);
      m_ctlHeader.SetWindowPos (NULL, 0, 0, cx, rc.Height (), SWP_NOZORDER | SWP_NOMOVE);
    }
}

#pragma warning ( disable : 4100 )
void CProjectTreeCtrl::
OnRButtonDown (UINT nFlags, CPoint point)
{
  UINT nFlags2;
  m_hPointedItem = HitTest (point, &nFlags2);
  if (m_hPointedItem && (nFlags2 & (TVHT_ONITEMICON | TVHT_ONITEMLABEL)))
    {
      m_bWasSelected = GetItemState (m_hPointedItem, TVIS_SELECTED) != 0;
      if (!m_bWasSelected)
        {
          VERIFY (SetItemState (m_hPointedItem, TVIS_SELECTED, TVIS_SELECTED));
        }
    }
  // CAppTreeCtrl::OnRButtonDown (nFlags, point);
}
#pragma warning ( default : 4100 )

#define ID_SPACE_FIRST ID_REFRESH
#define ID_SPACE_LAST ID_REFRESH

#pragma warning ( disable : 4100 )
void CProjectTreeCtrl::
OnRButtonUp (UINT nFlags, CPoint point)
{
  UINT nFlags2;
  HTREEITEM hItem = HitTest (point, &nFlags2);
  if (m_hPointedItem && (nFlags2 & (TVHT_ONITEMICON | TVHT_ONITEMLABEL)))
    {
      if (hItem == m_hPointedItem)
        {
          CMenu menuItem;
          CMenu *pMenu;
          if (menuItem.LoadMenu (IDM_PRJTREE_ITEM) && (pMenu = menuItem.GetSubMenu (0)) != NULL)
            {
              CProjectItem *pItem = (CProjectItem*) GetItemData (m_hPointedItem);
              if (!(pItem && (pItem->dwType & PI_FILE)))
                pMenu->EnableMenuItem (ID_OPEN, MF_BYCOMMAND|MF_GRAYED);
              if (pItem && (pItem->dwType & PI_FILE))
                {
                  pMenu->EnableMenuItem (ID_NEW_FILE, MF_BYCOMMAND|MF_GRAYED);
                  pMenu->EnableMenuItem (ID_NEW_GROUP, MF_BYCOMMAND|MF_GRAYED);
                  pMenu->EnableMenuItem (ID_ADD_FILE, MF_BYCOMMAND|MF_GRAYED);
                }
              if (!(pItem && !(pItem->dwType & (PI_FILE|PI_SUBITEM))))
                pMenu->EnableMenuItem (ID_RENAME_ITEM, MF_BYCOMMAND|MF_GRAYED);
              if (!GetItemData (m_hPointedItem))
                pMenu->EnableMenuItem (ID_REMOVE_ITEM, MF_BYCOMMAND|MF_GRAYED);
              pMenu->EnableMenuItem (ID_ITEM_PROPERTIES, MF_BYCOMMAND|MF_GRAYED);
              ClientToScreen (&point);
              pMenu->TrackPopupMenu (TPM_LEFTBUTTON|TPM_RIGHTBUTTON/*|TPM_RETURNCMD*/|TPM_LEFTALIGN|TPM_TOPALIGN, point.x, point.y, this);
            }
        }
      if (!m_bWasSelected && m_hPointedItem)
        {
          VERIFY (SetItemState (m_hPointedItem, 0, TVIS_SELECTED));
        }
    }
  else
    {
      CMenu menu;
      if (menu.CreatePopupMenu ())
        {
          DWORD dwResult = 0;
          CWnd *pWnd = this;
          bool bSeparated = false, bContinue = true, bProcess = false, bProperties = false;
          do
            {
              dwResult = pWnd->SendMessage (WM_APPEND_MENU, dwResult, (LPARAM) menu.GetSafeHmenu ());
              if (dwResult & 1)
                {
                  bProcess = true;
                  if (dwResult & 2)
                    {
                      bContinue = false;
                    }
                  if (dwResult & 4)
                    {
                      bSeparated = true;
                    }
                  if (dwResult & 8)
                    {
                      bProperties = true;
                    }
                }
              pWnd = pWnd->GetParent ();
            }
          while (pWnd && bContinue);

⌨️ 快捷键说明

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