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

📄 prjtreec.cpp

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

#include "stdafx.h"
#include "editcmd.h"
#include "resource.h"
#include "prjtreec.h"
#include "sheetpls.h"
#include "registry.h"
#include "editpad.h"
#include "wm.h"
#include "filesup.h"
#include "edfopdlg.h"
#include "edfaddlg.h"
	
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define ICON_WIDTH 16
#define ICON_HEIGHT 16
#define STATUS_WIDTH ICON_WIDTH
#define STATUS_HEIGHT ICON_HEIGHT
#define TEXT_DELTA 2

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

CProjectTreeCtrl::CProjectTreeCtrl () : m_dwLayout (0)
{
}

CProjectTreeCtrl:: ~ CProjectTreeCtrl ()
{
}

BOOL CProjectTreeCtrl::ExpandItem (HTREEITEM hItem, UINT nCode)
{
  if (Expand (hItem, nCode))
    {
      int iNormal, iSelected;
      if (GetItemState (hItem, TVIS_EXPANDED) & TVIS_EXPANDED)
        {
          if (GetItemImage (hItem, iNormal, iSelected) && iNormal == 2)
            SetItemImage (hItem, 3, 3);
        }
      else
        {
          if (GetItemImage (hItem, iNormal, iSelected) && iNormal == 3)
            SetItemImage (hItem, 2, 2);
        }
      return TRUE;
    }
  return FALSE;
}

HTREEITEM CProjectTreeCtrl::InsertFile (LPCTSTR lpszItem, int nImage, int nSelectedImage, LPARAM lParam, HTREEITEM hParent)
{
  HTREEITEM hItem = GetNextItem (hParent, TVGN_CHILD), hAfter = TVI_FIRST;
  CProjectItem *pItem;
  while (hItem)
    {
      pItem = (CProjectItem*) GetItemData (hItem);
      if (pItem->dwType & PI_FILE)
        break;
      hAfter = hItem;
      hItem = GetNextItem (hItem, TVGN_NEXT);
    }
  while (hItem)
    {
      pItem = (CProjectItem*) GetItemData (hItem);
      if (_tcsicmp (GetItemText (hItem), lpszItem) > 0)
        break;
      hAfter = hItem;
      hItem = GetNextItem (hItem, TVGN_NEXT);
    }
  if (!hItem)
    hAfter = TVI_LAST;
  return InsertItem (TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM, lpszItem, nImage, nSelectedImage, 0, 0, lParam, hParent, hAfter);
}

HTREEITEM CProjectTreeCtrl::InsertGroup (LPCTSTR lpszItem, int nImage, int nSelectedImage, LPARAM lParam, HTREEITEM hParent)
{
  HTREEITEM hItem = GetNextItem (hParent, TVGN_CHILD), hAfter = TVI_FIRST;
  CProjectItem *pItem;
  while (hItem)
    {
      pItem = (CProjectItem*) GetItemData (hItem);
      if ((pItem->dwType & PI_FILE) || _tcsicmp (GetItemText (hItem), lpszItem) > 0)
        break;
      hAfter = hItem;
      hItem = GetNextItem (hItem, TVGN_NEXT);
    }
  return InsertItem (TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM, lpszItem, nImage, nSelectedImage, 0, 0, lParam, hParent, hAfter);
}

BOOL CProjectTreeCtrl::
Create (DWORD dwStyle, CRect rect, CWnd * pParentWnd, UINT nID)
{
  if (m_dwLayout & PRJTREEC_HEADER)
    {
      rect.top += 15;
      rect.bottom -= 15;
    }
  return CAppTreeCtrl::Create (dwStyle, rect, pParentWnd, nID);
}

static int GetItemIcon (LPCTSTR pszName)
{
  int iIcon;
  CString sExt = GetNameExt (pszName);
  sExt.MakeLower ();
  if (sExt == _T ("c"))
    iIcon = 6;
  else if (sExt == _T ("cc") || sExt == _T ("cpp") || sExt == _T ("cxx"))
    iIcon = 7;
  else if (sExt == _T ("def"))
    iIcon = 8;
  else if (sExt == _T ("h") || sExt == _T ("hpp") || sExt == _T ("hxx") || sExt == _T ("inl") || sExt == _T ("hm"))
    iIcon = 9;
  else if (sExt == _T ("rc") || sExt == _T ("rc2"))
    iIcon = 10;
  else if (sExt == _T ("ico") || sExt == _T ("bmp") || sExt == _T ("cur") || sExt == _T ("gif") || sExt == _T ("jpg"))
    iIcon = 5;
  else
    iIcon = 4;
  return iIcon;
}

void CProjectTreeCtrl::
PopulateItem (CProjectItem *pParent, HTREEITEM hParent)
{
  CString sName;
  CProjectItem *pItem;
  POSITION pos = pParent->lstItems.GetHeadPosition ();
  int iIcon;
  while (pos)
    {
      pItem = pParent->lstItems.GetNext (pos);
      sName = GetNameExt (pItem->sPath);
      if (sName.IsEmpty ())
        sName = _T ("Unnamed");
      if (pItem->dwType & PI_FILE)
        {
          iIcon = GetItemIcon (pItem->sPath);
          InsertFile (sName, iIcon, iIcon, (LPARAM) pItem, hParent);
        }
      else
        PopulateItem (pItem, InsertGroup (sName, 2, 2, (LPARAM) pItem, hParent));
    }
}

void CProjectTreeCtrl::
Populate ()
{
  PopulateEmpty ();
  if (!g_pProject)
    return;
  CString sName = GetName (g_pProject->sPath);
  if (sName.IsEmpty ())
    sName = _T ("Unnamed");
  HTREEITEM hParent = InsertItem (TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM, sName, 0, 0, 0, 0, NULL, TVI_ROOT, TVI_FIRST), hItem;
  CProjectItem *pItem;
  int iIcon;
  POSITION pos = g_pProject->lstItems.GetHeadPosition ();
  while (pos)
    {
      pItem = g_pProject->lstItems.GetNext (pos);
      sName = GetNameExt (pItem->sPath);
      if (sName.IsEmpty ())
        sName = _T ("Unnamed");
      if (pItem->dwType & PI_ROOT)
        if (pItem->dwType & PI_FILE) // pItem->lstItems.IsEmpty ())
          {
            iIcon = GetItemIcon (pItem->sPath);
            InsertFile (sName, iIcon, iIcon, (LPARAM) pItem, hParent);
          }
        else
          if (pItem->dwType & PI_SUBITEM)
            {
              hItem = InsertGroup (sName, 1, 1, (LPARAM) pItem, hParent);
              PopulateItem (pItem, hItem);
              // ExpandItem (hItem, TVE_EXPAND);
            }
          else
            PopulateItem (pItem, InsertGroup (sName, 2, 2, (LPARAM) pItem, hParent));
    }
  ExpandItem (hParent, TVE_EXPAND);
  m_listSelected.AddTail (hParent);
}

void CProjectTreeCtrl::
PopulateEmpty ()
{
  m_listSelected.RemoveAll ();
  DeleteAllItems ();
}

void CProjectTreeCtrl::
PopulateName ()
{
  if (!g_pProject)
    return;
  CString sName = GetName (g_pProject->sPath);
  if (sName.IsEmpty ())
    sName = _T ("Unnamed");
  SetItemText (GetRootItem (), sName);
}

void CProjectTreeCtrl::
Paint (void)
{
  // Invalidate ();
  // UpdateWindow ();
  RedrawWindow ();
}

DWORD CProjectTreeCtrl::
GetLayout ()
{
  return m_dwLayout;
}

void CProjectTreeCtrl::
SetLayout (DWORD dwLayout)
{
  if (m_dwLayout != dwLayout)
    {
      m_dwLayout = dwLayout;
      if (!(m_dwLayout & PRJTREEC_HEADER) && ::IsWindow (m_ctlHeader.GetSafeHwnd ()))
        {
          m_ctlHeader.DestroyWindow ();
        }
      Invalidate ();
    }
}

void CProjectTreeCtrl::
MakeColumns ()
{
  if (m_dwLayout & PRJTREEC_HEADER)
    {
      CRect rect;
      GetWindowRect (rect);
      rect.right -= rect.left;
      rect.bottom -= rect.top;
      rect.left = rect.top =0;
      m_ctlHeader.m_pctlTree = this;
      rect.top = 0;
      rect.bottom = 17;
      if (!m_ctlHeader.Create (WS_CHILD | WS_VISIBLE, rect, GetParent (), GetDlgCtrlID () + 1))
        {
          return;
        }
      m_ctlHeader.FlatHeader ();
      CString sName0 = _T ("Name"), sName1 = _T ("Description");
      LPCTSTR pszName = REGISTRY_ROOT _T ("ProjectTree");
      int nWidth0 = 200,  nWidth1 = 250;
      RegLoadNumber (HKEY_CURRENT_USER, pszName, sName0, (DWORD*) &nWidth0);
      RegLoadNumber (HKEY_CURRENT_USER, pszName, sName1, (DWORD*) &nWidth1);
      HDITEM item;
      item.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;
      item.fmt = HDF_LEFT;
      item.cxy = nWidth0;
      item.pszText = (LPTSTR) (LPCTSTR) sName0;
      m_ctlHeader.InsertItem (0, &item);
      item.cxy = nWidth1;
      item.pszText = (LPTSTR) (LPCTSTR) sName1;
      m_ctlHeader.InsertItem (1, &item);
      // m_ctlHeader.RefreshItemRectCache ();
    }
}

BEGIN_MESSAGE_MAP (CProjectTreeCtrl, CAppTreeCtrl)
//{{AFX_MSG_MAP( CProjectTreeCtrl )
ON_NOTIFY_REFLECT (TVN_BEGINLABELEDIT, OnBeginLabelEdit)
ON_NOTIFY_REFLECT (TVN_ENDLABELEDIT, OnEndLabelEdit)
ON_NOTIFY_REFLECT (TVN_ITEMEXPANDED, OnItemExpanded)
ON_NOTIFY_REFLECT (TVN_SELCHANGED, OnSelectionChanged)
ON_WM_CREATE ()
ON_WM_DESTROY ()
ON_WM_LBUTTONDBLCLK ()
ON_WM_PAINT ()
ON_WM_LBUTTONDOWN ()
ON_WM_LBUTTONUP ()
ON_WM_RBUTTONDOWN ()
ON_WM_RBUTTONUP ()
ON_WM_SIZE ()
ON_MESSAGE (WM_APPEND_MENU, OnAppendMenu)
ON_MESSAGE (WM_PROCESS_MENU, OnProcessMenu)
ON_MESSAGE (WM_APPEND_PROPS, OnAppendProps)
ON_COMMAND(ID_PROPERTIES, OnProperties)
ON_COMMAND(ID_OPEN, OnOpen)
ON_COMMAND(ID_NEW_FILE, OnNewFile)
ON_COMMAND(ID_NEW_GROUP, OnNewGroup)
ON_COMMAND(ID_ADD_FILE, OnAddFile)
ON_COMMAND(ID_REMOVE_ITEM, OnRemoveItem)
ON_COMMAND(ID_ITEM_PROPERTIES, OnItemProperties)
ON_COMMAND(ID_RENAME_ITEM, OnRenameItem)
ON_COMMAND(ID_REFRESH, OnRefresh)
//}}AFX_MSG_MAP
// ON_MESSAGE (TVM_HITTEST, OnHitTest)
// ON_WM_TIMER ()
END_MESSAGE_MAP ()

/////////////////////////////////////////////////////////////////////////////
// CProjectTreeCtrl message handlers

void CProjectTreeCtrl::
OnSelectionChanged (NMHDR * pNMHDR, LRESULT * pResult)
{
  TV_DISPINFO *pTVDispInfo = (TV_DISPINFO *) pNMHDR;
  *pResult = 0;
}

void CProjectTreeCtrl::
OnBeginLabelEdit (NMHDR * pNMHDR, LRESULT * pResult)
{
  TV_DISPINFO *pTVDispInfo = (TV_DISPINFO *) pNMHDR;
  CProjectItem *pItem = (CProjectItem*) GetItemData (pTVDispInfo->item.hItem);
  *pResult = !(pItem && (pItem->dwType & PI_GROUP) && !(pItem->dwType & PI_SUBITEM));
}

void CProjectTreeCtrl::
OnEndLabelEdit (NMHDR * pNMHDR, LRESULT * pResult)
{
  TV_DISPINFO *pTVDispInfo = (TV_DISPINFO *) pNMHDR;
  CProjectItem *pItem = (CProjectItem*) GetItemData (pTVDispInfo->item.hItem);
  if (pItem && (pItem->dwType & PI_GROUP) && !(pItem->dwType & PI_SUBITEM))
    {
      SetItemText (pTVDispInfo->item.hItem, pItem->sPath = pTVDispInfo->item.pszText);
      ASSERT (g_pProject);
      g_pProject->SetModified ();
    }
  CWnd *pWnd = AfxGetMainWnd ();
  pWnd->SetForegroundWindow ();
  pWnd->SetFocus ();
}

void CProjectTreeCtrl::
OnItemExpanded (NMHDR * pNMHDR, LRESULT * pResult)
{
  NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW *) pNMHDR;
  if (GetItemState (pNMTreeView->itemNew.hItem, TVIS_EXPANDED) & TVIS_EXPANDED)
    {
      int iNormal, iSelected;
      if (GetItemImage (pNMTreeView->itemNew.hItem, iNormal, iSelected) && iNormal == 2)
        SetItemImage (pNMTreeView->itemNew.hItem, 3, 3);
    }
  else
    {
      int iNormal, iSelected;
      if (GetItemImage (pNMTreeView->itemNew.hItem, iNormal, iSelected) && iNormal == 3)
        SetItemImage (pNMTreeView->itemNew.hItem, 2, 2);
    }
  *pResult = 0;
}

int CProjectTreeCtrl::
OnCreate (LPCREATESTRUCT lpCreateStruct)
{
  if (CAppTreeCtrl::OnCreate (lpCreateStruct) == -1)
    return -1;
  m_objStatusImages.Create (IDB_PRJTREE, ICON_WIDTH, 0, RGB (0, 255, 0));
  SetImageList (&m_objStatusImages, TVSIL_NORMAL);
  return 0;
}

#pragma warning ( disable : 4100 )
void CProjectTreeCtrl::
OnPaint ()
{
  CPaintDC dc (this);           // device context for painting
  CWnd::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0);

  /*HTREEITEM hItem = GetFirstVisibleItem ();
  int n = GetVisibleCount () + 1;
  CRect rc, rc0, rc1;
  CFont *pOldFont = NULL;
  CFont normal;
  LOGFONT lf;
  GetFont ()->GetLogFont (&lf);
  lf.lfWeight = FW_NORMAL;
  normal.CreateFontIndirect (&lf);
  pOldFont = dc.SelectObject (&normal);
  CPen pen1 (PS_SOLID, 0,::GetSysColor (COLOR_BTNSHADOW)), pen2 (PS_SOLID, 0,::GetSysColor (COLOR_BTNFACE)),
  pen3 (PS_SOLID, 0,::GetSysColor (COLOR_WINDOWTEXT)), *pOldPen = dc.SelectObject (&pen1);
  CList < int, int >m_ext;
  CString sText;
  if (m_dwLayout & PRJTREEC_TABBEDCOLS)
    {
      if (m_dwLayout & PRJTREEC_HEADER)
        {
          VERIFY (m_ctlHeader.GetCachedItemRect (0, rc0));
          VERIFY (m_ctlHeader.GetCachedItemRect (1, rc1));
        }
      else
        {
          rc0.SetRect (0, 0, 200, 0);
          rc1.SetRect (200, 0, 550, 0);
        }
    }
  while (hItem && n--)
    {
      CString sItem = GetItemText (hItem);
      VERIFY (GetItemRect (hItem, &rc, TRUE));
      rc.right++;
      if (m_dwLayout & PRJTREEC_TABBEDCOLS)
        {
          if (rc0.right < rc.right + STATUS_WIDTH)
            {
              rc.right = rc0.right - STATUS_WIDTH;
            }
        }
      UINT state = GetItemState (hItem, TVIS_SELECTED | TVIS_EXPANDED);
      if (state & TVIS_SELECTED)
        {
          dc.SetTextColor (::GetSysColor (COLOR_HIGHLIGHTTEXT));
          dc.SetBkColor (::GetSysColor (COLOR_HIGHLIGHT));
        }

⌨️ 快捷键说明

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