Мое приложение отображает огромное количество файлов системных записей, хранящихся в памяти, используя ctreectrl
добавление всех элементов занимает ~ 20 секунд даже при использовании SetRedraw(False)
так как сделать виртуально полностью (широта, глубина) ctreectrl
& как его заселить?
Изменить # 1
Я хочу, чтобы отображаемые элементы порции были развернуты с самого начала, но я не хочу, например, сохранять их в дереве
Root-->
Child1-->
SubChile1
Child2
Child3
Вы не должны добавлять все элементы одновременно. Вы должны добавить только элементы верхнего уровня с cChildren = I_CHILDRENCALLBACK
и обрабатывать WM_NOTIFY
code == TVN_GETDISPINFO
если mask & TVIF_CHILDREN
задаватьcChildren
(Правда или ложь)code == TVN_ITEMEXPANDING
, action == TVE_EXPAND
— расширитьcChildren = I_CHILDRENCALLBACK
и возможно
code == TVN_ITEMEXPANDED
, action == TVE_COLLAPSE
— развалЧувство cChildren = I_CHILDRENCALLBACK
— если вы добавляете папку в список, вам не нужно сразу ее инициализировать (open handle, enum childs) — только когда вы впервые получили I_CHILDRENCALLBACK
(это когда ваш элемент становится видимым, но если папка достаточно большая (например, system32) — в нем слишком много элементов, но видны только несколько верхних в начале, новое начало видно при прокрутке пользователя вниз) — открыть папку, определить, есть ли в ней подпункты (и на основе этого набора cChildren
) но не полный перечислю это (делайте это только на <TVN_ITEMEXPANDING, TVE_EXPAND>
Я не советую делать это виртуальным.
Я использую для больших древовидных структур возможность сбора дочерней ветви только тогда, когда это необходимо. Я ловушку TVN_ITEMEXPANDING
Итак, как это сделать: сначала прочитайте первый уровень (root), затем держите все корневые узлы свернутыми, прочитайте все дочерние узлы корня (всего на 1 уровень глубиной) и заполните их.
Когда узел расширяется, у вас уже есть узлы, теперь читайте следующий уровень ниже дочерних узлов расширяющегося узла.
Таким образом, вы видите только расширенные узлы плюс один невидимый уровень.
Я делаю это таким образом, чтобы показать все узлы, которые можно развернуть со знаком +. Все узлы без дочерних узлов отображаются без него в виде листьев.
Второй способ — не заполнять строковые данные и позволить дереву загружать их с помощью обратного вызова. Но влияние мало. Настоящая проблема со скоростью — это количество узлов.