MFC Как сделать виртуальный ctreectrl?

Мое приложение отображает огромное количество файлов системных записей, хранящихся в памяти, используя ctreectrl добавление всех элементов занимает ~ 20 секунд даже при использовании SetRedraw(False) так как сделать виртуально полностью (широта, глубина) ctreectrl & как его заселить?

Изменить # 1
Я хочу, чтобы отображаемые элементы порции были развернуты с самого начала, но я не хочу, например, сохранять их в дереве

Root-->
Child1-->
SubChile1
Child2
Child3

3

Решение

Вы не должны добавлять все элементы одновременно. Вы должны добавить только элементы верхнего уровня с 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>

3

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

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

Итак, как это сделать: сначала прочитайте первый уровень (root), затем держите все корневые узлы свернутыми, прочитайте все дочерние узлы корня (всего на 1 уровень глубиной) и заполните их.

Когда узел расширяется, у вас уже есть узлы, теперь читайте следующий уровень ниже дочерних узлов расширяющегося узла.

Таким образом, вы видите только расширенные узлы плюс один невидимый уровень.

Я делаю это таким образом, чтобы показать все узлы, которые можно развернуть со знаком +. Все узлы без дочерних узлов отображаются без него в виде листьев.

Второй способ — не заполнять строковые данные и позволить дереву загружать их с помощью обратного вызова. Но влияние мало. Настоящая проблема со скоростью — это количество узлов.

2

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