CTreeCtrl - 获取项目位置

时间:2009-01-27 15:46:43

标签: c++ mfc

有没有办法获取CTreeCtrl中项目的位置(索引)?
我对特定级别的节点索引感兴趣。

我正在考虑在项目“数据”字段中维护项目位置,但问题是我的树已经排序,我无法预测项目将收到的位置(好吧,只有我提前对项目进行排序)我想避免)。

4 个答案:

答案 0 :(得分:1)

我认为你不能。我假设控件可能被视为一个数组(也许它仍然可以,但我找不到参考)。

无论如何,没有成员函数(根据MFC API)可以访问该信息

答案 1 :(得分:1)

 /// there is another way if you "Use Unicode Character Set" (visual studio)
 /// Properties->General->Character Set

    CPoint point;
    GetCursorPos(&point);
    m_Tree.ScreenToClient(&point);
    UINT nHitFlags;
    HTREEITEM hItem = m_Tree.HitTest(point, &nHitFlags);

    int idx = m_Tree.MapItemToAccId(hItem);

答案 2 :(得分:0)

获取节点句柄,然后迭代elem 迭代所有元素,同时计算元素,直到找到正确的项目?

答案 3 :(得分:0)

int GetIndex(const CString & a_Cstr)
{
    int idx = 0;
    std::vector<CString>::const_iterator _begIt = m_RulesVec.begin();
    std::vector<CString>::const_iterator _PosIt = find(m_RulesVec.begin(),      m_RulesVec.end(), a_Cstr);
    if (_PosIt == m_RulesVec.end()) {
        return -1;
    }
    else {
        while (_begIt != _PosIt) {
            ++idx;
            ++_begIt;
        }
        return idx;
    }
}

/// it can(must) be done in this function
/// OnNMClickRulesTree(NMHDR *pNMHDR, LRESULT *pResult)

    // Create vector like this
    std::vector<CString> Vec{"first", "second", "third" };

    // OnInit insert items to CtreeCtrl like this
    m_Tree.InsertItem("first", hItem);
    m_Tree.InsertItem("second", hItem);
    m_Tree.InsertItem("third", hItem);

    // then get cur selected item like this
    CPoint point;
    GetCursorPos(&point);
    m_Tree.ScreenToClient(&point);
    UINT nHitFlags;
    HTREEITEM hItem = m_Tree.HitTest(point, &nHitFlags);

    // get item text
    CString Cstr = m_Tree.GetItemText(hKid);
    int idx = GetIndex(Cstr);