Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файловый менеджер. SDI приложение 
:(
    Опции темы
rudolfninja
Дата 19.2.2013, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Приветствую всех. 
 Задание такое: необходимо разработать простейший двухпанельный файловый менеджер по аналогии со стандартным проводником Windows. 
 Файловый менеджер представляет собой UI – приложение с двухпанельным интерфейсом. На левой панели размещается дерево со списком объектов файловой системы (начиная с корневых каталогов дисков либо с виртуальных системных папок). На правой панели размещается список файлов в каталоге, выбранном в дереве на левой панели. 
 С MFC особо не работал, поэтому и возникли проблемы. Надо создать на базе SDI приложения. 
 Я разбил задачу навигации по файловой системе на несколько задач: 
 1) Получение содержимого файловой системы и заполнение дерева. 
 2) Распознование выделенного в дереве каталого или папки и отображение его содержимого на правой панели. 
 Как получить объекты файловой системы я примерно представляю (GetLogicalDrivers, FindFirstFile, FindNextFile). Непонятно как отобразить дерево в левой части менеджера и как отображать содержимое выделенного элемента в правой части. 
 Пока что это основные вопросы, которые меня волнуют. 
 Если кто знает как решить проблему или может посоветовать литературу, в которой есть решение подобной задачи - подскажите пожалуйста. 
 Спасибо.
PM MAIL Skype   Вверх
Earnest
Дата 20.2.2013, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Слева - дерево (CTreeCtrl), слева - список (CListCtrl). MSDN тебе в помощь.


--------------------
...
PM   Вверх
rudolfninja
Дата 20.2.2013, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Я создаю 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);
}



 В итоге не выходит запустить приложение. Вылетает эксепшн "Не удалось создать пустой документ".
 Я, вероятнее всего, что-то не так делаю, только пока не понимаю что. Подскажите, что не так.
PM MAIL Skype   Вверх
Earnest
Дата 21.2.2013, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



CTreeView и CTreeCtrl в принципе одно и тоже. Так что раз у тебя вью, то и используй вью (CTreeView), меньше мороки.
Добавлять туда дополнительный член m_TreeCtrl не надо (и вообще нехорошо), т.к. TreeView имеет функцию, которая возвращает ссылку на контрол. А если ты посмотришь внутрь, то увидишь, что там тупо преобразование типа. 

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

Добавлено через 2 минуты и 32 секунды
А вот твой вылет как раз и говорит о том, что документа-то у тебя нет (ибо нафик он тебе нужен).
Впрочем, все это затыкабельно.
Я плохо помню сейчас код MFC, а копаться времени нет, но ты посмотри сам, откуда вылетает исключение и чего ему там надо. И сделай.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.