CTreeCtrl - получение позиции элемента - PullRequest
1 голос
/ 27 января 2009

Есть ли способ получить позицию (индекс) элемента в CTreeCtrl?
Меня интересует индекс узла на его определенном уровне.

Я думал сохранить позиции элемента в поле «данные» элемента, но проблема в том, что мое дерево отсортировано, и я не могу предсказать позицию, которую получит элемент (хорошо, только если я отсортирую элементы заранее, что Я хотел бы избежать).

Ответы [ 4 ]

1 голос
/ 07 августа 2018
 /// 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);
1 голос
/ 27 января 2009

Не думаю, что ты можешь. Я предположил, что, возможно, элемент управления можно рассматривать как массив (возможно, он все еще может, но я не могу найти ссылку).

В любом случае, нет функций-членов (в соответствии с MFC API ), которые предоставляют вам доступ к этой информации

0 голосов
/ 07 августа 2018
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);
0 голосов
/ 27 января 2009

Получить дескриптор узла, а затем перебрать элемент Итерируйте по всем элементам, пока вы подсчитываете элементы, пока не дойдете до нужного элемента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...