CTreeCtrl - 获取项目位置

Posted

技术标签:

【中文标题】CTreeCtrl - 获取项目位置【英文标题】:CTreeCtrl - getting an item position 【发布时间】:2009-01-27 15:46:42 【问题描述】:

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

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

【问题讨论】:

你发现了吗? 是否有可能以某种方式使用GetMessagePos() 函数? 【参考方案1】:

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

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

【讨论】:

你能想出绕过这个问题的方法吗?我正在考虑在项目“数据”字段中维护项目位置,但问题是我的树已排序,我无法预测项目将收到的位置。【参考方案2】:
 /// 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);

【讨论】:

【参考方案3】:

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

【讨论】:

我希望做得比这更有效。我的树可能很大。 如果您还没有使用它,请在将项目添加到树结构时将索引放入 Tag 字段(请记住在删除元素时重建)【参考方案4】:
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);

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。

以上是关于CTreeCtrl - 获取项目位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时创建的 MFC 中获取 Treeview(CTreeCtrl) 的 Click 事件?

调用 SelectItem 函数时如何强制 CTreeCtrl 不滚动到项目?

为啥我的 CTreeCtrl 复选框不检查?

CTreeCtrl 以编程方式设置所选项目

将项目添加到 CTreectrl C++

如何在 MFC 中处理 CTreeCtrl 的状态更改事件