| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Файловый менеджер. SDI приложение |
| Автор: rudolfninja 19.2.2013, 23:12 |
| Приветствую всех. Задание такое: необходимо разработать простейший двухпанельный файловый менеджер по аналогии со стандартным проводником Windows. Файловый менеджер представляет собой UI – приложение с двухпанельным интерфейсом. На левой панели размещается дерево со списком объектов файловой системы (начиная с корневых каталогов дисков либо с виртуальных системных папок). На правой панели размещается список файлов в каталоге, выбранном в дереве на левой панели. С MFC особо не работал, поэтому и возникли проблемы. Надо создать на базе SDI приложения. Я разбил задачу навигации по файловой системе на несколько задач: 1) Получение содержимого файловой системы и заполнение дерева. 2) Распознование выделенного в дереве каталого или папки и отображение его содержимого на правой панели. Как получить объекты файловой системы я примерно представляю (GetLogicalDrivers, FindFirstFile, FindNextFile). Непонятно как отобразить дерево в левой части менеджера и как отображать содержимое выделенного элемента в правой части. Пока что это основные вопросы, которые меня волнуют. Если кто знает как решить проблему или может посоветовать литературу, в которой есть решение подобной задачи - подскажите пожалуйста. Спасибо. |
| Автор: Earnest 20.2.2013, 06:58 |
| Слева - дерево (CTreeCtrl), слева - список (CListCtrl). MSDN тебе в помощь. |
| Автор: rudolfninja 20.2.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. Например,
Ну и у этого класса, вроде как, нет члена m_pDocument. Втрой класс, вроде будет для отображения списка папок. С ним позже разобраться надо, т.к. еще с первым не разобрался. Потом я в класс CLeftView добавляю переменную типа CMFCShellTreeCtrl m_TreeCtrl и добавляю функцию:
В итоге не выходит запустить приложение. Вылетает эксепшн "Не удалось создать пустой документ". Я, вероятнее всего, что-то не так делаю, только пока не понимаю что. Подскажите, что не так. |
| Автор: Earnest 21.2.2013, 08:53 |
| CTreeView и CTreeCtrl в принципе одно и тоже. Так что раз у тебя вью, то и используй вью (CTreeView), меньше мороки. Добавлять туда дополнительный член m_TreeCtrl не надо (и вообще нехорошо), т.к. TreeView имеет функцию, которая возвращает ссылку на контрол. А если ты посмотришь внутрь, то увидишь, что там тупо преобразование типа. Не знаю, что это за зверь такой CMFCShellTreeCtrl, может в новых MFC добавили. Раньше был просто CTreeCtrl. Если это наследник CTreeCtrl с нужной тебе функциональностью, то варианта 2: - если он не содержит доп. членов данных, то используй простое преобразование для доступа к функциональности (т.е. напиши свой вариант ф-и GetTreeCtrl()) - если доп. члены данных есть (нестатические), то номер с преобразование не пройдет, придется сабклассить. При этом просто тупо сабклассить вью на контрол нельзя, ибо окно не может сабкласситься дважды, а вью тебе нужно. Можно, конечно, как ты сделал, вид и контрол сделать разными окнами одно в другом, но это ненужная кривота. Не говоря уже о том, что тебе придется прописывать все реакции на мувы ручками (чтобы контрол вместе с вью ресайзился). Проблема правильного сабклассинга точно решаема, но надо порыться в коде. Кстати, в связи с этим вопрос: а на кой тебе SDI и виды? И какой-такой документ будет? Просто пустышка, чтобы не морочиться? Альтернатива - обычное диалоговое приложение. Тогда, правда, самому нужно парится с разделяемыми панелями. Где больше геморроя - сказать сразу сложно. Добавлено через 2 минуты и 32 секунды А вот твой вылет как раз и говорит о том, что документа-то у тебя нет (ибо нафик он тебе нужен). Впрочем, все это затыкабельно. Я плохо помню сейчас код MFC, а копаться времени нет, но ты посмотри сам, откуда вылетает исключение и чего ему там надо. И сделай. |