Я в основном хочу иметь ту же виртуальную производительность, которую я могу получить с помощью элемента управления 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
Как отмечалось во многих других публикациях, очень дорогая часть об элементе управления Tree-View использует InsertItem
а также DeleteItem
, Быстрый способ улучшить производительность для этих операций — использовать SetRedraw
, Он не только скрывает мерцание, но и ускоряет процесс, так как рисунок кажется дорогим, хотя TVN_GETDISPINFO
используется.
Кроме того, быстрее переименовывать существующие элементы и изменять их данные, а не удалять и добавлять новые. Поэтому, когда у меня большой список и я знаю, что следующее обновление будет содержать примерно такое же количество +/- пары, я перебираю элементы, переименовываю их, меняю их lparams и синхронизирую (т.е. удаляю / добавляю) оставшиеся в соответствии с новыми данными. В зависимости от размера списка выполнение этих дополнительных вычислений может значительно повысить производительность.
Элемент управления Win32 TreeView не поддерживает тот виртуальный режим, который вы ищете. Так что вам понадобится пользовательский элемент управления.