CFileDialog кнопка «Сохранить» не возвращается из DoModal

#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 подробно описана функциональность.