Иллюстрированный самоучитель по Visual Studio.Net


Обращаемся к операционной системе - часть 4


sName.SetAt (sName.GetLength() - 1, '\0');

//====== Затем в начале строки

int iPos = sNarae.ReverseFind('\\') ;

if (iPos != -1)

sName = sNarne.Mid(iPos + 1) ;

//=== Вставляем узел в дерево

HTREEITEM hNew = m_Tree.InsertltemfsName,id,idSel,h);

//====== Вставляем пустой узел

if (NotErapty(s))

m_Tree.Insertltem("", 0, 0, hNew);

}

Функция SHGetFilelnf о вызывается дважды, так как от системы надо получить два индекса изображений: для объекта файловой системы в обычном состоянии и для него же в выбранном состоянии. Метод Insertltem класса CTreeCtrl вставляет узел в дерево. Его параметры задают:

  • местоположение узла, то есть описатель родительского узла (h), О соответствующий узлу дерева текст (s),

  • индексы двух изображений (id, idSel) в уже сформированном списке типа CImageList.

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

При проверке диска (функция NotEmpty) мы не сканируем его далеко вглубь, а просто проверяем на наличие хотя бы одной папки. Если диск имеет хотя бы одну папку, то вставляем внутрь соответствующего ей узла пустой элемент (Insertltem ("", 0, 0, h)), который дает возможность впоследствии раскрыть (expand) данный узел. Затем, когда пользователь действительно его раскроет, мы обработаем это событие и удалим пустой элемент. Вместо него наполним раскрытую ветвь реальными сущностями. Этот прием обеспечивает постепенное наполнение дерева по сценарию, определяемому действиями пользователя.

Примечание

Сначала я написал рекурсивную функцию анализа и заполнения всего файлового дерева при начальном запуске приложения. Оказалось, что эта процедура занимает 5-7 минут, в течение которых приложение выглядит мертвым. Правда, после нее дерево раскрывает свои ветви мгновенно, так как оно уже хранит информацию обо всех своих ветвях.


Начало  Назад  Вперед