Реакция на выбор узла дерева
Поиск "своих" файлов, то есть файлов с расширением mgn, и демонстрацию их содержимого в виде окон с рисунками следует производить в ответ на выбор (selection) пользователем одного из объектов файлового дерева. Это действие отличается от раскрытия узла дерева, когда пользователь однократно нажимает на маркер (+) раскрытия или делает двойной щелчок на самом узле. Для того чтобы выбрать тот или иной узел, пользователь либо щелкает мышью изображение, либо текстовую строку, соответствующую данному узлу. Реакцию на уведомление об этом событии (OnSelchanged) мы уже ввели в состав класса CLeftview.
Теперь введите внутрь этой функции следующие коды:
void CLeftView::OnSelchanged (NMHDR *pNMHDR, LRESULT *pResult) { NM_TREEVIEW* p = (NM_TREEVIEW*)pNMHDR; //====== Освобождение контейнера текущих файлов GetDocument() › FreeDocs(); //====== Поиск нужных файлов SearchForDocs (GetPath(p › itemNew.hItem)); //====== Генерация картинок и демонстрация их в окне //====== правого представления GetDocument() › ProcessDocs(); *pResult = 0; }
Схема обработки сообщения =TVN_SELCHANGED такая же – WM_NOTIFY, но алгоритм отличается. Акцент в обработке переносится в класс документа. Там следует хранить данные о файлах документов, обнаруженных в выбранной папке или на логическом диске, туда же следует ввести новые методы: FreeDocs и ProcessDocs. При изменении выбора пользователя мы:
- уничтожаем предыдущие данные с помощью метода FreeDocs;
- ищем и запоминаем свои файлы в выбранном объекте файловой системы (метод SearchForDocs);
- создаем новые объекты вспомогательного класса CPolygon;
- просим их прочесть свои данные в обнаруженных файлах;
- отображаем их в виде картинок в окне правого представления с помощью метода ProcessDocs.
Поиск документов своего типа (mgn-файлов) производится по той же схеме с использованием класса CFindFile и его методов поиска объектов файловой системы. Но если ранее мы просматривали все объекты, задав маску поиска "*.*", то теперь мы можем сузить поиск, задав маску "*.mgn". Полные пути найденных файлов будем хранить в контейнере m_sFiles типа vector<cstring>, который чуть позже мы вставим в число членов класса документа.
А сейчас дополните класс CLeftview методом:
void CLeftView::SearchForDocs (CString s) { //====== Дополняем файловый путь маской поиска s += "*.mgn"; CFileFind cff; BOOL bFound = cff.FindFile(s); while (bFound) { bFound = cff.FindNextFile(); //==== Запоминаем файловые пути в контейнере строк GetDocument() › m sFiles.push back(cff.GetFilePath()); } }