Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Файловый менеджер на С++ с использовнием MFC

21K
11 февраля 2007 года
raMp
23 / / 11.02.2007
Необходимо написать файловый менеджер типа Total Commander. Подскажите как отобразить файлы и как по ним передвигаться?
Страницы:
320
11 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Что конкретно должен делать файловый менеджер ?
Как надо отображать файлы ? Можешь сделать так :
Слева 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.Если есть время до сдачи - садись разбирайся и спрашивай конкретно - то что не получается.Поможем:)
21K
11 февраля 2007 года
raMp
23 / / 11.02.2007
Спасибо за ответ.
Вот вопрос поточнее.. Как вычитать логические разделы и допустим связать их ComboBox?
До сдачи как никак еще полгодика.
320
11 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: raMp
Спасибо за ответ. Думаю буду еще спрашивать. До сдачи как никак еще полгодика


Если полгодика - тогда нормально:) Успеешь, разберешься.Ты начни
делать - там и конкретные вопросы появятся.

320
12 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Да,забыл по поводу твоего вопроса. :)
1. Вытаскиваешь из Toolbox на фрорму ComboBox.
2.В класс диалога добавляешь контрольную переменную ComboBox m_combo.
3.В ф-ии OnInitDialog дописываешь

 
Код:
CHAR buff[200];
    ::GetLogicalDriveStrings(199,buff);
    for(char*p=buff;*p!=0;p+=4){
        m_combo.AddString(p);
    }
    m_combo.SetWindowText("C:\\");

Все.В ComboBoxe будут отображены все твои диски.
21K
12 февраля 2007 года
raMp
23 / / 11.02.2007
Писал что-то , писал.. потом понял что DialogBox пишу... а мне нужно использовать CMainFrame. Как допустим в это окно вставить CComboBox?:confused:
320
13 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Ты решил делать сразу в однодокументом приложении(SDI).Для начала все же сделай в диалоге,когда все получится - сделаешь и в SDI.Так тебе будет проще.Дело в том,что SDI и покрасивей и мощней,но сложней.(эл.управления из Toolbox не вытащишь) Ниже я расскажу
как в класс рамки поставить С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 IDD_DIALOGBAR               103
#define IDC_COMBO1                    1001

Что то такое...Дописываешь.
5.Заходишь в файл MainFrm.cpp,находишь ф-ию OnCreate(....) и вместо или после слов(только ничего там не удаляй из того что уже есть)
// TODO: Delete these three lines if you don't want the toolbar to be dockable(выделены зеленным)
пишешь следующий
Код:
...dbar.Create(this,IDD_DIALOGBAR,CBRS_ALIGN_TOP|CBRS_BORDER_LEFT,101);
    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, в котором содержатся названия дисков.Все.
21K
14 февраля 2007 года
raMp
23 / / 11.02.2007
Спасиба. За ответ.
Вот еще хочу поинтересоваться по поводу литературы. У меня есть в наличии только : VC 6++ и MFC Авторы: Уайт, Олафсен, Скрайбнер и MSDN. Причем книга еще в pdf. Какие ты можешь книги мне еще посоветовать?
320
14 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Книги поищи для начала тут.Могу еще посоветовать книгу Том Арчер,Эндрю Уайтч-
епел Visual C++.NET.Библия пользователя.В электронном виде не видел,
но продается,можно купить.Она правда больше для работы с Visual Studio
2003,но все равно ведь будете переходить на 2003 или 2005:) Зато достаточно полная,много примеров.Почитай.А еще конечно MSDN - без
него никак.
21K
14 февраля 2007 года
raMp
23 / / 11.02.2007
Cпасиба. Я правда уже на 2005 вижуалке :)
21K
15 февраля 2007 года
raMp
23 / / 11.02.2007
Я наверное надоел с вопросиками :) ну вот еще 1: вообщем, разрабатываю функцию что при нажатии в окне (CListCtrl использую) двойным щелчком по папке выполнялось действие. Я кое что сделал уже , сообщения о двойном щелчке обрабатывается, ну и вызывается эта функция. Но тут вопрос возникает как считать то на что я нажал, тобишь строку допустим с именем папки на которой я кликнул?
320
16 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Так ты в SDI(однодокументное) делаешь или в диалоге?Если в SDI почему
CListCtrl, надо было сделать CListView.Пиши где делаешь в диалоге или
SDI.
21K
16 февраля 2007 года
raMp
23 / / 11.02.2007
Пишу в SDI. ой, перепутал, да CListView. Извинюсь :)
320
16 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Ну вобщем ты добрался до сути.Отсюда и начинается файл.менеджер:)
Что у тебя в проекте разбил на 2 части,поставил сплиттер?В ф-ии обработчике двойного щелчка должно быть примерно следующее:
Код:
NMITEMACTIVATE * info = (NMITEMACTIVATE *) pNMHDR;
    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,
так что пиши что у тебя в этом классе есть.Иначе не заработает.
320
16 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Могу ,кстати, поискать у себя,и если найду кинуть тебе в личку
код списка.Но завтра.Или ты не ищешь легких путей?:D
21K
16 февраля 2007 года
raMp
23 / / 11.02.2007
Спасиба, но если честно, хочеться очень самому написать что то такое... Это как бы вообще первое что я с окнами делаю, раньше всё что делали - консольные приложения.

Вот уже разбил на 2 окна, поставил сплиттер. Только вот я немножко подругому пишу... Как бы подобие Total Commander'a идет у меня, тобишь без дерева.
320
16 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
А что у тебя CListView и... ?
21K
16 февраля 2007 года
raMp
23 / / 11.02.2007
и еще один CListView =) к примеру в одном одна папке отображается, а в другом другая...
320
16 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: raMp
и еще один CListView =) к примеру в одном одна папке отображается, а в другом другая...


Т.е. у тебя получается 2 списка?Зачем?Тогда может лучше убрать сплиттер оставить один список и ComboBox,который указывает диск.
Допустим ты выбрал в ComboBoxe диск С - в списке отображены содержимое диска,двойной щелчок открывает папку и в списке отображено содержимое папки.А так как ты пишешь - то что получается?
Выбран диск С,что отображает каждый из списков?

21K
16 февраля 2007 года
raMp
23 / / 11.02.2007
Вообщем, я хочу сделать 2 ComboBox'a 1 выбирает диск допустим в левом окне, а 2 в правом окне.


вот кстати ты затронул ComboBox. Как с него получать информацию то, я вчера пол ночи просидел над этим? надо создавать новый класс какой нить или можно через класс CMainFrame считать текст после изменения, а потом вызывать функцию допустим с класса который отображает в списке директории и передать к примеру значение на которое надо перейти и перезаписать лист?
320
16 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Не очень удачное решение.
У тебя получится,что в обоих ComboBox одинаковые строки(логические диски),т.е. они дублируют друг друга.Хватит тогда одного СomboBox и одного списка,будет проще и понятней .
Потом где расположены ComboBox в классе рамки ? Почему не хочешь дерево ? ComboBox менее наглядный,потом что у тебя в них ? Если ты
хочешь сделать красиво делай с деревом:D Будет и красиво и попрактикуешься хорошо.
Считать текст с ComboBox можно так :
 
Код:
m_combo.GetWindowText(path);

где path - переменная CString,т.е путь.
21K
20 февраля 2007 года
raMp
23 / / 11.02.2007
фух.. вот полностью с навигацией разобрался, написал. подскажи с чего начать разработку функций копировать, вставить, удалить?
320
20 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Тебе нужно создать ContextMenu,которое бы открывалось при нажатии правой кнопки мыши на иконке файла в списке.Создай его в Resource View. B Messages класса списка добавь ф-ию OnContextMenu.
В класс списка добавь переменную CPoint point;
Напиши там.
 
Код:
CListCtrl &theCtrl=GetListCtrl();
    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.Отдельно писать ф-ии копирования, перемещения,удаления не надо,они есть готовые.Например как будет выглядеть ф-ия копирования
Код:
void MyListView::OnFileCopy()
{
        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.h вот так
 
Код:
extern CString ss1;

а в файле stdafx.cpp пропиши так
 
Код:
extern CString ss1=" ";

Это глобальная переменная которая видна во всей программе.Пробуй.
P.S.Все же опиши подробнее на каком варианте ты остановился(дерево-списокили 2 списка) и почему.
9
20 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: m_Valery
...
а в файле stdafx.cpp пропиши так
 
Код:
extern CString ss1=" ";

...


stdafx.cpp - вообще, лучше не трогать. Ищите другой вариант.

320
20 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Ты имеешь ввиду,что так будет нарушена инкапсуляция ?
В принципе это можно прописывать не обязательно в stdafx.
По правилам бы наверно эту переменную лучше хранить в классе документа.Так будет правильнее,документ и предназаначен для хранения
данных.
21K
20 февраля 2007 года
raMp
23 / / 11.02.2007
У меня имеется на данный момент 2 варианта:
1. дерево + список
2. список (в нем показываются диски) и 2-ой список в котором показываются папки.

1 вариант дался мне очень тяжело.
2 вариант буквально час наверное если не меньше.

пока начал разрабатывать копирование.. но тут думал проще сделать пока что, без вызова меню нажатием правой клавиши, добавил диалоговое окно в котором есть кнопка, но вот с этой кнопкой возникла проблемка, она дезактивирована (серым цветом и не нажимается) не знаю в чем проблема...

вот кусок кода:
Код:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
.......

    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;
}
320
21 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Посмотри Properties этой кнопки,если там в Disabled - true, измени на
false.
21K
26 февраля 2007 года
raMp
23 / / 11.02.2007
2 вопроса:

1. как копировать папки? (::CopyFile только работает с файлами)

2. есть ли какая функция по перемещению файлов. а то я сначала копирую файл в новое место а потом удаляю его со старого?
320
26 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
1.Открываешь папку и копируешь каждый файл.
2.Перемещать файлы ф-ией
 
Код:
BOOL MoveFile(                  
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName
);
21K
07 апреля 2007 года
raMp
23 / / 11.02.2007
Возник маленький вопросик.
 
Код:
void CMainFrame::OnBnClickedSearch()
{
    CSearch search;
    search.DoModal ();
}

...
class CSearch : public CDialog
....



Вот, я открыл диалаговое окно. В какой функции нужно писать то что должно отобразится в нем при запуске.
Конструктор срабатывает когда идет CSearch search;

МСДН перечитал, ничего что то не нашел, вполне возможно из-за того что туго с англиским.

Помогите плз
320
07 апреля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: raMp
Возник маленький вопросик.
...
Вот, я открыл диалаговое окно. В какой функции нужно писать то что должно отобразится в нем при запуске.
Конструктор срабатывает когда идет CSearch search;

МСДН перечитал, ничего что то не нашел, вполне возможно из-за того что туго с англиским.

Помогите плз


Тебе надо делать так.Добавить в проект класс СSearch производный от Dialog.Тогда у тебя в ресурсах появится и сам диалог CSearch.Его можно редактировать в тех же ресурсах,добавлять различные элементы управления.Для этого класса в Messages и Overrides можно добавлять
ф-ии как для обычного диалога.В класс допустим вида(View) добавь переменную класса CSearch search.
Так правильней.А в ф-ии обработчике вывзывай DoModal();Что конкретно
не получается ?

21K
08 апреля 2007 года
raMp
23 / / 11.02.2007
Это всё я сделал. Меня интересует в какой функции класса CSearch можно задать то что будет в нем отображаться по умолчанию. К примеру жмешь на кнопку "Поиск" ну и появляется окно и там уже вписаны к примеру список дисков.

вообщем что нить на подобие функции которая в классе CMainFrame

 
Код:
int CMainFrame::OnCreate (LPCREATESTRUCT lpCreateStruct)
{
.....
}
320
08 апреля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: raMp
Это всё я сделал. Меня интересует в какой функции класса CSearch можно задать то что будет в нем отображаться по умолчанию. К примеру жмешь на кнопку "Поиск" ну и появляется окно и там уже вписаны к примеру список дисков.

вообщем что нить на подобие функции которая в классе 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 уже вписаны
диски.
21K
29 апреля 2007 года
raMp
23 / / 11.02.2007
У меня имеются 2 вопроса.

1. Как в списке (стиль report) на определенный элемент поставить свои цвет подсветки. то бишь к примеру директории желтым подсвечиваются и т.д.. просто как не старался, мне все эл-ты закрашивало в один цвет.

2. В диалоговых окнах если выделено что то другое кроме кнопки то при нажатии Enter окно закрывается. Искал сообщение через Add Event Handler и ничего не нашел :(

3. Используя ф-ию к примеру SetTitle ("A"); у меня окно называется Untitled - A, в чем проблема?

выручите плзз... уже все написано, остались эти мелочи буквально.
320
01 мая 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: raMp
...
1. Как в списке (стиль report) на определенный элемент поставить свои цвет подсветки. то бишь к примеру директории желтым подсвечиваются и т.д.. просто как не старался, мне все эл-ты закрашивало в один цвет.
...
3. Используя ф-ию к примеру SetTitle ("A"); у меня окно называется Untitled - A, в чем проблема?
...


1.Не уверен,но имхо этого сделать нельзя.Попробую,если получится сообщу.
3. Для диалога поменять заголовок окна ?

 
Код:
...
SetWindowText("А");
...
21K
01 мая 2007 года
raMp
23 / / 11.02.2007
не для диалога, а для главного окна. На котором списки и т.д.
320
01 мая 2007 года
m_Valery
1.0K / / 08.01.2007
В ф-ии OnInitInstance допиши
 
Код:
...
 m_pMainWnd->SetWindowText("afsdfsdf");
...
21K
01 мая 2007 года
raMp
23 / / 11.02.2007
А указатель это на что? И в каком классе данную функцию искать нужно а то я найти не могу
320
01 мая 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: raMp
Я извинияюсь конечно, но я не могу найти такой функции и указателя в проекте. Функции даже мсдном найти не могу....


Пардон, InitInstance . Находится в классе С..._App.Заходишь в Сlass View,там найдешь этот класс,она там,в конце допишешь ту строку
что я выше написал,только текст свой,есстественно напиши в
кавычках:)
CWnd* m_pMainWnd;
// main window (usually same AfxGetApp()-> m_pMainWnd )

21K
02 мая 2007 года
raMp
23 / / 11.02.2007
Нашел. спасиба )
28K
12 мая 2007 года
4ainik
7 / / 12.05.2007
Здравствуйте :) , не могли бы вы мне помочь с написанием файлового менеджера, просто в С++ я нифига не шарю. :confused:, а сдать надо меньше чем через месяц :eek: . Мне надо менеджер в котором нужно было бы просматривать и открывать файлы, удолять и просматривать инфу про файл(тип, размер,дата).
Даже не знаю с чего начать:confused: .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог