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