📄 apptreec.cpp
字号:
#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 + -