Dana
Dana

Reputation: 2739

CTreeCtrl - getting an item position

Is there a way of getting the position (index) of an item in a CTreeCtrl?
I am interested in the index of a node at its particular level.

I was thinking to maintain the item positions within the item "data" field, but the problem is that my tree is sorted and I cannot predict the position an item will receive (well, only if I sort the items in advance which I would like to avoid).

Upvotes: 1

Views: 3881

Answers (4)

James
James

Reputation: 129

 /// 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);

Upvotes: 1

James
James

Reputation: 129

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);

Upvotes: 0

RvdK
RvdK

Reputation: 19790

Get the node handle and then iterate over the elem Iterate over all the elements, while you count the elements, till you reach the right item?

Upvotes: 0

cbrulak
cbrulak

Reputation: 15629

I don't think you can. I assumed that maybe the control could be treated as an array (maybe it still can but I can't find a reference).

Anyways, there are no member functions (according to the MFC API) that give you access to that information

Upvotes: 1

Related Questions