Как сделать быстрый виртуальный Tree-View Control только с двумя уровнями быстро?

Я в основном хочу иметь ту же виртуальную производительность, которую я могу получить с помощью элемента управления List-View. С помощью элемента управления List-View вы можете установить ItemCount, а в уведомлении LVN_GETDISPINFO вы затем заполняете информацию для элементов, как только они прокручиваются видимым.

Теперь виртуальная функциональность, предоставляемая Tree-View, хороша для очень глубоких деревьев, поэтому вы можете добавлять элементы только после расширения узла (через TVN_ITEMEXPANDING), а TVN_GETDISPINFO можно использовать для заполнения информации об элементе, когда элемент прокручивается видимым. Но что делать, если у вас есть «всегда развернутое» двухуровневое дерево (только для целей проектирования), в котором TVN_ITEMEXPANDING не будет иметь никакого смысла, и вы захотите добавлять элементы только тогда, когда они будут видны. Проблема в том, что не существует такой вещи, как SetItemCount () или аналогичной, которая уже изменяет размер дерева.

В моем случае, заполнение информации об элементе (текст, изображение, выбранное изображение) — не дорогая часть, а вставка элементов (все на одном уровне).

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

Есть ли другие идеи для достижения того, чего я хочу, кроме как получить собственный контроль?

Все дерево будет выглядеть примерно так, почти как список, просто мне нравится внешний вид дерева.

RootNode
|
|--Item 1
|--Item 2
|--Item 3
|--Item 4
|--Item 5
|--Item 6
|--Item 7
...
|__Item 1000

0

Решение

Как отмечалось во многих других публикациях, очень дорогая часть об элементе управления Tree-View использует InsertItem а также DeleteItem, Быстрый способ улучшить производительность для этих операций — использовать SetRedraw, Он не только скрывает мерцание, но и ускоряет процесс, так как рисунок кажется дорогим, хотя TVN_GETDISPINFO используется.

Кроме того, быстрее переименовывать существующие элементы и изменять их данные, а не удалять и добавлять новые. Поэтому, когда у меня большой список и я знаю, что следующее обновление будет содержать примерно такое же количество +/- пары, я перебираю элементы, переименовываю их, меняю их lparams и синхронизирую (т.е. удаляю / добавляю) оставшиеся в соответствии с новыми данными. В зависимости от размера списка выполнение этих дополнительных вычислений может значительно повысить производительность.

2

Другие решения

Элемент управления Win32 TreeView не поддерживает тот виртуальный режим, который вы ищете. Так что вам понадобится пользовательский элемент управления.

0

По вопросам рекламы [email protected]