Re: Странное поведение DeleteAllItems в СTreeControl
От: cpp_best  
Дата: 24.02.06 18:30
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

У меня тоже проблемы с DeleteAllItems. При вызове DeleteAllItems при заполненном дереве (да и пустом тоже) последующие вставки элементов в дерево проявляются глюки. Элементы вроде как вставляются, но в дереве не отображаются, если кликать мышкой в том месте, где должны быть элементы, то они (невидимые) будут выделяться.

Вот код:

    hRootCategory = TreeCtrl.InsertItem(_T("root"), 0, 0, NULL, TVI_SORT); // сколько угодно раз
    ...
    TreeCtrl.DeleteAllItems();
    hRootCategory = TreeCtrl.InsertItem(_T("root"), 0, 0, NULL, TVI_SORT); // теперь глюки

Кстати, код товарища _devdi_ тоже не заработал у меня (Win2k Pro SP4, IE 6 SP1, VS 7.1).
Можно все это обойти конечно удалением поэлементно вот так (как в msdn):

    HTREEITEM hCurrent = TreeCtrl.GetNextItem(hRootCategory, TVGN_PREVIOUS);
    TVITEM item;
    TCHAR szText[1024];
    while (hCurrent != NULL)
    {
        item.hItem = hCurrent;
        item.mask = TVIF_TEXT | TVIF_HANDLE;
        item.pszText = szText;
        item.cchTextMax = 1024;

        hCurrent = TreeCtrl.GetNextItem(hCurrent, TVGN_PREVIOUS);

        if (TreeCtrl.GetItem(&item))
            TreeCtrl.DeleteItem(item.hItem);
    }
    // до сюда удаляет все кроме первого элемента
    // добавляются отныне элементы прекрасно
    hCurrent = TreeCtrl.GetNextItem(hCurrent, TVGN_PREVIOUS);
    item.hItem = hCurrent;
    item.mask = TVIF_TEXT | TVIF_HANDLE;
    item.pszText = szText;
    item.cchTextMax = 1024;
    TreeCtrl.DeleteItem(item.hItem); // удаляем последний элемент, и опять глючит

Уже три дня угробил, помогите! Пробовал переименовать тот первый элемент, но не получается даже получить его имя, а этот код не меняет имени:
TreeCtrl.SetItemText(hCurrent, "New value");

Но наверное можно победить DeleteAllItems()? MS ее просто использует одним вызовом и ничего более. Спасибо большое заранее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.