CFileDialog обработка имени файла с точкой
От: megapixel  
Дата: 30.07.09 11:20
Оценка:
Добрый день,
Для записи файлов использую CFileDialog, но столкнулся с одной проблемой.
Имя файла 123.45.jpg а мне надо чтобы юзер выбрал 123.45.gif или 123.45.bmp
При создании диалога задаю дефолтное имя файла writeDialog.m_ofn.lpstrFile = "123.45"
Но слишком умный класс показывает имя только 123 а 45 считает расширением.
Соответственно какой-бы фильтр юзер не выбрал (gif или bmp) расширение всё-равно остаётся 45.

Решения:
1) После doModal проверять активный фильтр и менять расширения файла на нужное.
Минусы: юзер в диалоге видит имя 123 а запишется 123.45.gif не будет сообщения в случае если такой файл уже существует.
Отдельно проверять случай если юзер отредактировал имя файла в строке а не просто поменял фильтр.

2) Записывать в переменную writeDialog.m_ofn.lpstrFile = "123.45.jpg" но тогда при смене фильтра и попытке записи будет выдаваться сообщение что такой файл уже существует.
3) Записывать в переменную writeDialog.m_ofn.lpstrFile = "123.45.!use" в этом случае при смене фильтране проверяется существуеьт-ли файл 123.45.gif

Возможно кто-то уже нашёл решение этой проблемы, может надо какой-нибудь виртуальный метод переопределить.
Заранее спасибо.
mfc cfiledialog save extension
Re: CFileDialog обработка имени файла с точкой
От: Андрей Россия  
Дата: 30.07.09 11:41
Оценка:
Здравствуйте, megapixel, Вы писали:

использовать п.2 и убрать флаг OFN_OVERWRITEPROMPT не пробовал? (этот флаг по умолчанию в конструктор передается)
Re[2]: CFileDialog обработка имени файла с точкой
От: megapixel  
Дата: 30.07.09 12:33
Оценка:
Здравствуйте, Андрей, Вы писали:
А>использовать п.2 и убрать флаг OFN_OVERWRITEPROMPT не пробовал? (этот флаг по умолчанию в конструктор передается)
В этом случае не будет поверки на то что уже существует 123.45.gif или 123.45.bmp

Если вручную задать имя файла в диалоге "123.45" то работает и 45 не убирается, надо как-то програмно эту ситуацию симитировать.
Re: CFileDialog обработка имени файла с точкой
От: megapixel  
Дата: 04.08.09 07:29
Оценка:
Решение проблемы:
Надо поменять настройки папки "hide extensions for known file types".

        // keep and set folder option (show/hide) extensions
        SHELLFLAGSTATE sfs;
        DWORD dwMask = SSF_SHOWEXTENSIONS;
        SHGetSettings(&sfs,  dwMask);
        I1 opt_keep = sfs.fShowExtensions;
        SHELLSTATE shellstate = {0};
        shellstate.fShowExtensions = -1;
        SHGetSetSettings(&shellstate,  dwMask, TRUE);

        CString strFilter = _T("Microsoft Excel Worksheet (.xls)|*.xls|CSV
           (Comma Separated Values)    (.csv)|*.csv|Text File (.txt)|*.txt|All Files (*.*)|*.*||");
        CFileDialog dlg(    FALSE, 
            _T("dat"),
            _T("of3.12"), 
            OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
            strFilter, 
            NULL);

        if(dlg.DoModal() == IDOK)
        {
            CString extstr = dlg.GetFileExt();
            CString ttt2 = dlg.GetPathName();
        }

        // restore folder option (show/hide) extensions
        shellstate.fShowExtensions = opt_keep;
        SHGetSetSettings(&shellstate,  dwMask, TRUE);

Спасибо за помощь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.