CTreeCtrl 的 GetNextItem 成员函数很诡异,nCode 设为 TVGN_NEXT | TVGN_CHILD 会一直返回传进去的 hItem 值,而不是返回下一个兄弟 item “或”第一个 child item。
所以,只好自己写遍历函数,没有采用递归的做法,用了一个 STL List 容器来保存下一个兄弟 item 和第一个 child item,遍历返回的依据是 item 的 lParam 值等于给定的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | HTREEITEM CModelNodeTreePane::_GetTreeItemByID(const unsigned int uiItemID) { HTREEITEM hCurrItem = m_kModelNodeTreeCtrl.GetRootItem(), hItem; std::list kItemList; kItemList.push_back(hCurrItem); while (kItemList.size() > 0) { hCurrItem = kItemList.front(); kItemList.pop_front(); if ((unsigned int)m_kModelNodeTreeCtrl.GetItemData(hCurrItem) == uiItemID) { return hCurrItem; } if ((hItem = m_kModelNodeTreeCtrl.GetChildItem(hCurrItem)) != NULL) { kItemList.push_back(hItem); } if ((hItem = m_kModelNodeTreeCtrl.GetNextSiblingItem(hCurrItem)) != NULL) { kItemList.push_back(hItem); } } return NULL; } |
