Файловый менеджер на С++ с использовнием MFC
Как надо отображать файлы ? Можешь сделать так :
Слева TreeView,splitter,справа ListView.Т.е внешне выглядит как
проводник Windows, при нажатии на иконку файла в ListView выпадает
контекстное меню Copy-Replace-Delete-Save-Save As.Двойной щелчок по
иконке - раскрывает директорию или запускает файл (ShellExecute)Работа дерева и списка синхронизирована,в меню надо добавить пункт Styles для красивого отображения Big Icons,Small Icons,List Icons,Report , так же надо добавить ToolBar cо стилямии пунктом Level Up.У меня когда-то это было экзаменнационная работа по MFC, :)
на выполнение давали 2 недели.Если знаешь MFC - сделать можно за час,если нет - ...:) Тут на пальцах на форуме в 2 словах не расскажешь как делать.
Можно сделать проще - в диалоге,отображать в ListBoxe,диски в ComboBox выглядит хуже,но делать проще.Но опять же все зависит от
того насколько знаешь MFC.Если есть время до сдачи - садись разбирайся и спрашивай конкретно - то что не получается.Поможем:)
Вот вопрос поточнее.. Как вычитать логические разделы и допустим связать их ComboBox?
До сдачи как никак еще полгодика.
Если полгодика - тогда нормально:) Успеешь, разберешься.Ты начни
делать - там и конкретные вопросы появятся.
1. Вытаскиваешь из Toolbox на фрорму ComboBox.
2.В класс диалога добавляешь контрольную переменную ComboBox m_combo.
3.В ф-ии OnInitDialog дописываешь
::GetLogicalDriveStrings(199,buff);
for(char*p=buff;*p!=0;p+=4){
m_combo.AddString(p);
}
m_combo.SetWindowText("C:\\");
Все.В ComboBoxe будут отображены все твои диски.
как в класс рамки поставить СomboBox,но для начала позволю себе несколько советов общего характера.(исходя из своего опыта создания такого же курсового проекта).
1.Не начинай проект с второстепенных вещей(ComboBox).Их ты поставишь потом.
2.В данном проекте на первоначальном этапе тебе нужно разбить окно на СTreeView и CListView,поставить разделитель-splitter.
3.Построй список CListView(чтоб он правильно отображал то что входит в ту или иную директорию).
4.Построй дерево CTreeView(чтоб тоже все правильно отображалось).
5.Синхронизируй их работу между собой(т.е если ты открываешь в дереве какую то папку,она открывается и в списке).
6.Сделай всю дополнительную работу по доведению "до ума" файл-менеджера,т.е ставишь иконки,панель инстументов,строку состояния.меняешь заголовок окна,делаешь часы,контекстные меню
для непосредственной работы с файлами и т.д и т.п.(Все это детали).
Но если ты начнешь с них - то до сути доберешься еще не скоро(увязнешь в деталях).Я лично вообщене использовал бы тут ComboBox, а просто текстовое поле для отображения текущего адреса, а ComboBox
это будет точно как у Microsoft(клавиши Win + E - проводник).Его придется связывать и синхронизировать со списком.Ладно поехали c ComboBox.
1.Добавь в класс рамки CMainFrame 2 переменные CDialogBar dbar и CReBar rbar(добавляй с помощью Wizard и сделай их private).
2.Переходишь на вкладку ResourceView и добавляешь Add Resource->Dialog->IDD_DIALOGBAR[English]
3.Появиться ToolBox,вытаскиваешь на эту диалоговую панель ComboBox.
4.Заходишь в файл Resource.h там обязательно должно было прописано
#define IDC_COMBO1 1001
Что то такое...Дописываешь.
5.Заходишь в файл MainFrm.cpp,находишь ф-ию OnCreate(....) и вместо или после слов(только ничего там не удаляй из того что уже есть)
// TODO: Delete these three lines if you don't want the toolbar to be dockable(выделены зеленным)
пишешь следующий
rbar.Create(this);
rbar.AddBar(&dbar,"Address :");
CComboBox* m_combo=(CComboBox*)dbar.GetDlgItem(IDC_COMBO1);
CHAR buff[200];
::GetLogicalDriveStrings(199,buff);
for(char*p=buff;*p!=0;p+=4){
m_combo->AddString(p);
}
m_combo->SetWindowText("C:\\");
...
Будет добавлена диалоговая панель инструментов с ComboBox, в котором содержатся названия дисков.Все.
Вот еще хочу поинтересоваться по поводу литературы. У меня есть в наличии только : VC 6++ и MFC Авторы: Уайт, Олафсен, Скрайбнер и MSDN. Причем книга еще в pdf. Какие ты можешь книги мне еще посоветовать?
епел Visual C++.NET.Библия пользователя.В электронном виде не видел,
но продается,можно купить.Она правда больше для работы с Visual Studio
2003,но все равно ведь будете переходить на 2003 или 2005:) Зато достаточно полная,много примеров.Почитай.А еще конечно MSDN - без
него никак.
CListCtrl, надо было сделать CListView.Пиши где делаешь в диалоге или
SDI.
Что у тебя в проекте разбил на 2 части,поставил сплиттер?В ф-ии обработчике двойного щелчка должно быть примерно следующее:
CListCtrl &theCtrl = GetListCtrl();
// Получаем индекс
int index = info->iItem;
if(index != -1)
{
static char Path[MAX_PATH];
// Если каталог не корневой
if(Current[0] != 0)
{
wsprintf(Path, "%s\\%s", Current, theCtrl.GetItemText(index, 0));
}
else
{
// Забираем букву диска из lParam элемента
wsprintf(Path, "%c:", theCtrl.GetItemData(index));
bRoot = TRUE;
}
// Определение типа элемента
DWORD type = GetFileAttributes(Path) & FILE_ATTRIBUTE_DIRECTORY;
// Если выбранный элемент - каталог
if(type)
{
// "Заходим внутрь"
strcpy(Current, Path);
CMainFrame * mframe = ((CMainFrame*)GetParentFrame());
MeTreeView * leftree = ((MeTreeView*)mframe->m_splitter.GetPane(0,0));
leftree->GetItemByPath(Path);
}
else
{
// Запуск файла
ShellExecute(m_hWnd, "open", Path, 0, Path, SW_SHOW);
}
}
*pResult = 0;
Но по всей вероятности у тебя другие переменные в классе CListView,
так что пиши что у тебя в этом классе есть.Иначе не заработает.
код списка.Но завтра.Или ты не ищешь легких путей?:D
Вот уже разбил на 2 окна, поставил сплиттер. Только вот я немножко подругому пишу... Как бы подобие Total Commander'a идет у меня, тобишь без дерева.
Т.е. у тебя получается 2 списка?Зачем?Тогда может лучше убрать сплиттер оставить один список и ComboBox,который указывает диск.
Допустим ты выбрал в ComboBoxe диск С - в списке отображены содержимое диска,двойной щелчок открывает папку и в списке отображено содержимое папки.А так как ты пишешь - то что получается?
Выбран диск С,что отображает каждый из списков?
вот кстати ты затронул ComboBox. Как с него получать информацию то, я вчера пол ночи просидел над этим? надо создавать новый класс какой нить или можно через класс CMainFrame считать текст после изменения, а потом вызывать функцию допустим с класса который отображает в списке директории и передать к примеру значение на которое надо перейти и перезаписать лист?
У тебя получится,что в обоих ComboBox одинаковые строки(логические диски),т.е. они дублируют друг друга.Хватит тогда одного СomboBox и одного списка,будет проще и понятней .
Потом где расположены ComboBox в классе рамки ? Почему не хочешь дерево ? ComboBox менее наглядный,потом что у тебя в них ? Если ты
хочешь сделать красиво делай с деревом:D Будет и красиво и попрактикуешься хорошо.
Считать текст с ComboBox можно так :
где path - переменная CString,т.е путь.
В класс списка добавь переменную CPoint point;
Напиши там.
point.x=cp.x;
point.y=cp.y;
CMenu menu;
menu.LoadMenu(IDR_CONTEXT_MENU);
menu.GetSubMenu(0)->TrackPopupMenu(IDR_CONTEXT_MENU,point.x,point.y,this);
Дальше делаешь обработчики для каждого пункта меню.Назначаются при помощи Add Event Handler.Отдельно писать ф-ии копирования, перемещения,удаления не надо,они есть готовые.Например как будет выглядеть ф-ия копирования
{
dialog1 d;
d.DoModal();
CListCtrl& theCtrl = GetListCtrl();
int nItem = theCtrl.GetNextItem(-1, LVNI_SELECTED);
CString temp;
if(nItem != -1)
{
static char Path[MAX_PATH];
if(Current[0] != 0)
{
wsprintf(Path, "%s\\%s", Current, theCtrl.GetItemText(nItem, 0));
}
else
{
wsprintf(Path, "%c:", theCtrl.GetItemData(nItem));
bRoot = TRUE;
}
DWORD type = GetFileAttributes(Path) & FILE_ATTRIBUTE_DIRECTORY;
strcpy(Current, Path);
::CopyFile(Path,ss1,TRUE);
}
}
а в файле stdafx.cpp пропиши так
Это глобальная переменная которая видна во всей программе.Пробуй.
P.S.Все же опиши подробнее на каком варианте ты остановился(дерево-списокили 2 списка) и почему.
а в файле stdafx.cpp пропиши так
...
stdafx.cpp - вообще, лучше не трогать. Ищите другой вариант.
В принципе это можно прописывать не обязательно в stdafx.
По правилам бы наверно эту переменную лучше хранить в классе документа.Так будет правильнее,документ и предназаначен для хранения
данных.
1. дерево + список
2. список (в нем показываются диски) и 2-ой список в котором показываются папки.
1 вариант дался мне очень тяжело.
2 вариант буквально час наверное если не меньше.
пока начал разрабатывать копирование.. но тут думал проще сделать пока что, без вызова меню нажатием правой клавиши, добавил диалоговое окно в котором есть кнопка, но вот с этой кнопкой возникла проблемка, она дезактивирована (серым цветом и не нажимается) не знаю в чем проблема...
вот кусок кода:
{
.......
dbar.Create(this,IDD_DIALOGBAR,CBRS_ALIGN_BOTTOM|CBRS_BORDER_LEFT,101);
CButton *m_button = (CButton*)dbar.GetDlgItem(IDC_COPY_BUTTON);
m_button->SetButtonStyle (BS_PUSHBUTTON);
return 0;
}
false.
1. как копировать папки? (::CopyFile только работает с файлами)
2. есть ли какая функция по перемещению файлов. а то я сначала копирую файл в новое место а потом удаляю его со старого?
2.Перемещать файлы ф-ией
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName
);
{
CSearch search;
search.DoModal ();
}
...
class CSearch : public CDialog
....
Вот, я открыл диалаговое окно. В какой функции нужно писать то что должно отобразится в нем при запуске.
Конструктор срабатывает когда идет CSearch search;
МСДН перечитал, ничего что то не нашел, вполне возможно из-за того что туго с англиским.
Помогите плз
...
Вот, я открыл диалаговое окно. В какой функции нужно писать то что должно отобразится в нем при запуске.
Конструктор срабатывает когда идет CSearch search;
МСДН перечитал, ничего что то не нашел, вполне возможно из-за того что туго с англиским.
Помогите плз
Тебе надо делать так.Добавить в проект класс СSearch производный от Dialog.Тогда у тебя в ресурсах появится и сам диалог CSearch.Его можно редактировать в тех же ресурсах,добавлять различные элементы управления.Для этого класса в Messages и Overrides можно добавлять
ф-ии как для обычного диалога.В класс допустим вида(View) добавь переменную класса CSearch search.
Так правильней.А в ф-ии обработчике вывзывай DoModal();Что конкретно
не получается ?
вообщем что нить на подобие функции которая в классе CMainFrame
{
.....
}
вообщем что нить на подобие функции которая в классе CMainFrame
...
Так точно так же.Добавь к классу этого диалога ф-ию OnInitDialog.
Добавь в ресурсах к диалоговому окну ComboBox, 2 переменные
CComboBox m_combo; CString m_path; и в OnInitDialog допиши
m_path="C:\\";
CHAR buff[200];
::GetLogicalDriveStrings(199,buff);
for (char*p=buff;*p!=0;p+=4){
m_combo.AddString(p);
}
...
Теперь когда появляется этот диалог в ComboBox уже вписаны
диски.
1. Как в списке (стиль report) на определенный элемент поставить свои цвет подсветки. то бишь к примеру директории желтым подсвечиваются и т.д.. просто как не старался, мне все эл-ты закрашивало в один цвет.
2. В диалоговых окнах если выделено что то другое кроме кнопки то при нажатии Enter окно закрывается. Искал сообщение через Add Event Handler и ничего не нашел :(
3. Используя ф-ию к примеру SetTitle ("A"); у меня окно называется Untitled - A, в чем проблема?
выручите плзз... уже все написано, остались эти мелочи буквально.
1. Как в списке (стиль report) на определенный элемент поставить свои цвет подсветки. то бишь к примеру директории желтым подсвечиваются и т.д.. просто как не старался, мне все эл-ты закрашивало в один цвет.
...
3. Используя ф-ию к примеру SetTitle ("A"); у меня окно называется Untitled - A, в чем проблема?
...
1.Не уверен,но имхо этого сделать нельзя.Попробую,если получится сообщу.
3. Для диалога поменять заголовок окна ?
SetWindowText("А");
...
m_pMainWnd->SetWindowText("afsdfsdf");
...
Пардон, InitInstance . Находится в классе С..._App.Заходишь в Сlass View,там найдешь этот класс,она там,в конце допишешь ту строку
что я выше написал,только текст свой,есстественно напиши в
кавычках:)
CWnd* m_pMainWnd;
// main window (usually same AfxGetApp()-> m_pMainWnd )
Даже не знаю с чего начать:confused: .