#c #cfiledialog
Вопрос:
С помощью приведенного ниже кода диалоговое окно сохранения файла отображается, как и ожидалось, с двумя кнопками: Сохранить и Отменить. Нажатие кнопки Отмена возвращает с result=IDCANCEL
, но нажатие кнопки Сохранить или ввод ввода не возвращает с DoModal
, просто перерисовывает окно имени файла. Есть ли какая-либо причина, по которой кнопка «Сохранить» не должна работать?
// Code below is in a message handler of a modeless dialog
CString defaultExt, filter;
defaultExt = "fits";
filter = "FITS image Files (*.fits)|*.fits|All image files (*.img; *.fits)|*.img; *.fits|All Files (*.*)|*.*||";
CFileDialog dlg(FALSE/*save as*/, defaultExt, "GeneratedImage", OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST, filter, this);
int result = (int)dlg.DoModal(); // does not return if Save is clicked
Поведение такое же, если необязательный аргумент CFileDialog
is bVistaStyle=FALSE
.
Visual Studio 2019 v16.7.7, 32-разрядная отладочная сборка, созданная и работающая в 64-разрядной Windows 7 (тот же результат работает в 64-разрядной Windows 10).
Комментарии:
1.
OFN_PATHMUSTEXIST
в диалоговом окне сохранения выглядит странно. Вы действительно указали имя файла перед тем, как нажать кнопку Сохранить?2. Комбинация
OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST
будет означать, что: (а) Вы можете использовать только существующий файл для сохранения; (б) когда вы укажете такой файл, вы получите всплывающее окно с вопросом: «Вы уверены, что хотите перезаписать этот файл?» (или что-то в этом роде). Если вы не видите последнего, значит, вы не указали приемлемое имя файла.3. @j6t: Имя файла по умолчанию («GeneratedImage») отображается в поле имя файла.
4. @Adrian Mole:Цель состояла в том, чтобы (1) запросить, собирается ли пользователь перезаписать существующий файл; и (2) каталог должен существовать. Но я вижу, что, поскольку каталог уже указан в диалоговом окне сохранения файла, флаг не имеет смысла. Однако удаление
OFN_PATHMUSTEXIST
не меняет поведения.
Ответ №1:
Также есть проблема с вашей строкой фильтра. Вы не должны включать пробелы в строку шаблона.
oldFilter = "FITS image Files (*.fits)|*.fits|All image files (*.img; *.fits)|*.img; *.fits|All Files (*.*)|*.*||";
--- REMOVE THIS SPACE --------------------------------------------------------------^
newFilter = "FITS image Files (*.fits)|*.fits|All image files (*.img; *.fits)|*.img;*.fits|All Files (*.*)|*.*||";
Смотрите документацию участника lpstrFilter здесь:
https://docs.microsoft.com/en-us/windows/win32/api/commdlg/ns-commdlg-openfilenamew#members
Комментарии:
1. В документе говорится, что вы не должны включать пробелы в шаблон, чего я не сделал.
2. Извините, я пропустил указанное вами место. Я удалил его, но это не изменило поведения.
3. НП… В прошлых версиях Windows мы сталкивались с проблемами, связанными с пробелами в строке фильтра (обычно файлы не фильтруются должным образом). Возможно, MFC «исправляет» это при передаче в диалоговое окно сохранения.
Ответ №2:
Вроде как нашел проблему. Очевидно, вы не можете сохранить файл в библиотеке.
В Windows 7 при переходе к библиотекам / документам на левой панели отображается «Библиотека документов, включает 2 расположения» на правой панели. Затем нажатие кнопки Сохранить ничего не делает. Если выбран другой тип сохранения как, я могу сохранить.
Если я перейду в простую папку, проблем не возникнет; файлы всегда можно сохранить.
CFileDialog
ведет себя так, как будто библиотеки доступны только для чтения, но зависят от типа файла, выбранного в фильтре, И расширения, выбранного в поле Имя файла.
Возможно, кто-то знает, где CFileDialog
подробно описана функциональность.