Как работать с файловым диалогом в VC++ 6.0?
От: Турилин Александр Сергеевич  
Дата: 30.03.03 14:44
Оценка:
Здравствуйте!

Я хочу при нажатии на стандартную кнопку Open из Toolbar'a получать ссылку на выбранный файл.
MSDN мне рекоммендует написать собственную функцию-реакцию на константу ID_FILE_OPEN. Спасибо. говорю я ему. Еще хотелось бы знать, что именно туда надо писать!
В том же самом МСДН я нашел диалог, который называется CFileDialog. Тут можно все задавать с помощью FLAGS ( только не понятно как этот FLAGS устроен — это массив или что?) и прочих параметров в конструкторе или с помощью разнообразных методов. Потом говориться, что нужно сделать DoModal. На этом месте все ломается...
В любом случае это не позволяло мне получить ссылку на файл.

Да — еще мне надо ограничить расширения. Это можно сделать в том же CFileDialog, а если в нем не получается, то как?

Заранее спасибо!

31.03.03 00:10: Перенесено модератором из 'C/C++' — ПК
Re: Как работать с файловым диалогом в VC++ 6.0?
От: $ergi0 Украина  
Дата: 30.03.03 22:04
Оценка:
что подразумевается под ссылкой на файл?
Re[2]: Как работать с файловым диалогом в VC++ 6.0?
От: Турилин Александр Сергеевич  
Дата: 30.03.03 22:10
Оценка:
Здравствуйте, $ergi0, Вы писали:

E>что подразумевается под ссылкой на файл?


Это не имеет значения. Все, что угодно — FILE*, CFile — имя файла в конце концов!
Главное — вернуть ЧТО-ТО, по чему можно установить, на что пал выбор пользователя!
Re: Как работать с файловым диалогом в VC++ 6.0?
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 30.03.03 22:23
Оценка:
Здравствуйте, Турилин Александр Сергеевич, Вы писали:

ТАС>Я хочу при нажатии на стандартную кнопку Open из Toolbar'a получать ссылку на выбранный файл.

ТАС>Да — еще мне надо ограничить расширения. Это можно сделать в том же CFileDialog, а если в нем не получается, то как?

std::string GetFileName()
{
    CFileDialog dlg(FALSE);            // FALSE - диалог сохранения файла, TRUE - открытия

    dlg.m_ofn.lpstrDefExt = "dat";
    dlg.m_ofn.lpstrFilter = "Dat-файлы (*.dat)\0*.dat\0Все файлы (*.*)\0*.*\0\0";    // фильтры по рсширениям

    char cur_dir[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, cur_dir);
    dlg.m_ofn.lpstrInitialDir = cur_dir;    // начальная директория

    if (dlg.DoModal() == IDOK)        // показываем диалог
        return dlg.m_ofn.lpstrFile;    // пользователь нажал OK - возвращаем имя файла

    return "";                // пользователь нажал не OK
}


Вся тонкая настройка производится через структуру OPENFILENAME. В CFileDialog есть поле m_ofn. Это — та самая структура.
Делается так: создаем экземпляр класса CFileDialog, настраиваем m_ofn, вызываем DoModal(). Если DoModal() вернет IDOK, то берем имя файла из поля lpstrFile.
Собственно, это в приведенном выше примере и демонстрируется.
... << RSDN@Home 1.0 beta 6a >>
Re: Как работать с файловым диалогом в VC++ 6.0?
От: Игнат Россия  
Дата: 31.03.03 07:08
Оценка:
Здравствуйте, Турилин Александр Сергеевич, Вы писали:

ТАС>Здравствуйте!


ТАС>Я хочу при нажатии на стандартную кнопку Open из Toolbar'a получать ссылку на выбранный файл.

ТАС>MSDN мне рекоммендует написать собственную функцию-реакцию на константу ID_FILE_OPEN. Спасибо. говорю я ему. Еще хотелось бы знать, что именно туда надо писать!
ТАС>В том же самом МСДН я нашел диалог, который называется CFileDialog. Тут можно все задавать с помощью FLAGS ( только не понятно как этот FLAGS устроен — это массив или что?) и прочих параметров в конструкторе или с помощью разнообразных методов. Потом говориться, что нужно сделать DoModal. На этом месте все ломается...
ТАС>В любом случае это не позволяло мне получить ссылку на файл.

ТАС>Да — еще мне надо ограничить расширения. Это можно сделать в том же CFileDialog, а если в нем не получается, то как?


ТАС>Заранее спасибо!


Если я правильно понял, то используется либо MDI или SDI интерфейс, в этом случае в классе документе необходимо переопределить виртуальную функцию
BOOL CDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
    if (!CDocument::OnOpenDocument(lpszPathName))
        return FALSE;
    
    // TODO: Add your specialized creation code here
    return TRUE;
}

Она вызывается после удачного закрытия окна "Open file", и её параметр есть имя файла.
Re[2]: Как работать с файловым диалогом в VC++ 6.0?
От: Vicont Россия  
Дата: 31.03.03 15:06
Оценка:
Здравствуйте, Игнат, Вы писали:

И>Здравствуйте, Турилин Александр Сергеевич, Вы писали:


ТАС>>Здравствуйте!


ТАС>>Я хочу при нажатии на стандартную кнопку Open из Toolbar'a получать ссылку на выбранный файл.

ТАС>>MSDN мне рекоммендует написать собственную функцию-реакцию на константу ID_FILE_OPEN. Спасибо. говорю я ему. Еще хотелось бы знать, что именно туда надо писать!
ТАС>>В том же самом МСДН я нашел диалог, который называется CFileDialog. Тут можно все задавать с помощью FLAGS ( только не понятно как этот FLAGS устроен — это массив или что?) и прочих параметров в конструкторе или с помощью разнообразных методов. Потом говориться, что нужно сделать DoModal. На этом месте все ломается...
ТАС>>В любом случае это не позволяло мне получить ссылку на файл.

ТАС>>Да — еще мне надо ограничить расширения. Это можно сделать в том же CFileDialog, а если в нем не получается, то как?


ТАС>>Заранее спасибо!


И>Если я правильно понял, то используется либо MDI или SDI интерфейс, в этом случае в классе документе необходимо переопределить виртуальную функцию

И>
И>BOOL CDoc::OnOpenDocument(LPCTSTR lpszPathName) 
И>{
И>    if (!CDocument::OnOpenDocument(lpszPathName))
И>        return FALSE;
И>    
И>    // TODO: Add your specialized creation code here
И>    return TRUE;
И>}

И>

И>Она вызывается после удачного закрытия окна "Open file", и её параметр есть имя файла.

И>


Наверно ты немного неправильно понял...
Надо переопределить ф-цию OnFileOpen() она м.б и не виртуальной, и обрабатываться на ID_FILE_OPEN
Там вызываешь диалог и читаешь документ...
Re[3]: Как работать с файловым диалогом в VC++ 6.0?
От: Турилин Александр Сергеевич  
Дата: 31.03.03 19:38
Оценка:
Спасибо всем. Все пока работает. Хотя она почему-то ругается, на выход по Cancel — но это дело поправимое!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.