Файловый менеджер. SDI приложение

 
0
 
C++
ava
rudolfninja | 20.02.2013, 00:12
Приветствую всех.
Задание такое: необходимо разработать простейший двухпанельный файловый менеджер по аналогии со стандартным проводником Windows.
Файловый менеджер представляет собой UI – приложение с двухпанельным интерфейсом. На левой панели размещается дерево со списком объектов файловой системы (начиная с корневых каталогов дисков либо с виртуальных системных папок). На правой панели размещается список файлов в каталоге, выбранном в дереве на левой панели.
С MFC особо не работал, поэтому и возникли проблемы. Надо создать на базе SDI приложения.
Я разбил задачу навигации по файловой системе на несколько задач:
1) Получение содержимого файловой системы и заполнение дерева.
2) Распознование выделенного в дереве каталого или папки и отображение его содержимого на правой панели.
Как получить объекты файловой системы я примерно представляю (GetLogicalDrivers, FindFirstFile, FindNextFile). Непонятно как отобразить дерево в левой части менеджера и как отображать содержимое выделенного элемента в правой части.
Пока что это основные вопросы, которые меня волнуют.
Если кто знает как решить проблему или может посоветовать литературу, в которой есть решение подобной задачи - подскажите пожалуйста.
Спасибо.
Ответы (3)
ava
Earnest | 20.02.2013, 06:58 #
Слева - дерево (CTreeCtrl), слева - список (CListCtrl). MSDN тебе в помощь.
ava
rudolfninja | 20.02.2013, 10:34 #
Я создаю MFC приложение. Application type выбираю Single document и оставляю включенной опцию Document\View architecture support. В Project Style выбираю Windows Explorer. Это сразу дает разделенное окно. В User Interface Features, я так понимаю, уже не надо жать Split Window, т.к. сам стиль Windows Explorer уже создаст разделенное окно. Следующие настройки оставляю без изменений. В итоге создается проект, с классами CLeftView : public CTreeView и CMainFrame : public CFrameWndEx.
Как я понимаю, первый класс будет отображать мое дерево. Заменить все CTreeView на CMFCShellTreeCtrl не выходит, т.к. у них нет некоторых методов, которые вызывает CTreeView. Например,


CTreeView::PreCreateWindow(cs);

CTreeView::OnInitialUpdate();


Ну и у этого класса, вроде как, нет члена m_pDocument.
Втрой класс, вроде будет для отображения списка папок. С ним позже разобраться надо, т.к. еще с первым не разобрался.
Потом я в класс CLeftView добавляю переменную типа CMFCShellTreeCtrl m_TreeCtrl и добавляю функцию:



BOOL CLeftView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
    CRect rectDummy(0, 0, 0, 0);
    const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
    return m_TreeCtrl.Create(dwTreeStyle, rectDummy, this, 1200);
}



В итоге не выходит запустить приложение. Вылетает эксепшн "Не удалось создать пустой документ".
Я, вероятнее всего, что-то не так делаю, только пока не понимаю что. Подскажите, что не так.
ava
Earnest | 21.02.2013, 08:53 #
CTreeView и CTreeCtrl в принципе одно и тоже. Так что раз у тебя вью, то и используй вью (CTreeView), меньше мороки.
Добавлять туда дополнительный член m_TreeCtrl не надо (и вообще нехорошо), т.к. TreeView имеет функцию, которая возвращает ссылку на контрол. А если ты посмотришь внутрь, то увидишь, что там тупо преобразование типа.

Не знаю, что это за зверь такой CMFCShellTreeCtrl, может в новых MFC добавили. Раньше был просто CTreeCtrl. Если это наследник CTreeCtrl с нужной тебе функциональностью, то варианта 2:
- если он не содержит доп. членов данных, то используй простое преобразование для доступа к функциональности (т.е. напиши свой вариант ф-и GetTreeCtrl())
- если доп. члены данных есть (нестатические), то номер с преобразование не пройдет, придется сабклассить. При этом просто тупо сабклассить вью на контрол нельзя, ибо окно не может сабкласситься дважды, а вью тебе нужно. Можно, конечно, как ты сделал, вид и контрол сделать разными окнами одно в другом, но это ненужная кривота. Не говоря уже о том, что тебе придется прописывать все реакции на мувы ручками (чтобы контрол вместе с вью ресайзился). Проблема правильного сабклассинга точно решаема, но надо порыться в коде.
Кстати, в связи с этим вопрос: а на кой тебе SDI и виды? И какой-такой документ будет? Просто пустышка, чтобы не морочиться?
Альтернатива - обычное диалоговое приложение. Тогда, правда, самому нужно парится с разделяемыми панелями. Где больше геморроя - сказать сразу сложно.

Добавлено позднее:
А вот твой вылет как раз и говорит о том, что документа-то у тебя нет (ибо нафик он тебе нужен).
Впрочем, все это затыкабельно.
Я плохо помню сейчас код MFC, а копаться времени нет, но ты посмотри сам, откуда вылетает исключение и чего ему там надо. И сделай.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить