C++ CFileDialog";“保存”;按钮不从DoModal返回

C++ CFileDialog";“保存”;按钮不从DoModal返回,c++,cfiledialog,C++,Cfiledialog,使用下面的代码,文件保存对话框按预期显示,有两个按钮:保存和取消。单击取消返回result=IDCANCEL,但单击保存或键入Enter不会从DoModal返回,只会重新绘制文件名窗口。是否有任何原因导致“保存”按钮不起作用 // Code below is in a message handler of a modeless dialog CString defaultExt, filter; defaultExt = "fits"; filter = "FITS

使用下面的代码,文件保存对话框按预期显示,有两个按钮:保存和取消。单击取消返回
result=IDCANCEL
,但单击保存或键入Enter不会从
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
的可选参数为
bVistaStyle=FALSE
,则行为相同


Visual Studio 2019 v16.7.7,32位调试版本,基于64位Windows 7构建并运行(在64位Windows 10上运行的结果相同)。

您的筛选器字符串也有问题。模式字符串中不应包含空格

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成员文档:
找到了问题,有点像。显然,您无法将文件保存到库中

在Windows 7中,导航到左侧窗格中的库/文档时,会在右侧窗格中显示“文档库,包括2个位置”。然后,单击“保存”不起任何作用。如果选择了其他“另存为”类型,我可以保存

如果我导航到一个简单的文件夹,没有问题;文件总是可以保存的

CFileDialog
的行为就像库是只读的,但取决于从筛选器中选择的文件类型和在“文件名”框中选择的扩展名


也许有人知道详细描述
CFileDialog
功能的位置。

保存对话框中的n_路径必须存在
。在单击“保存”之前是否确实指定了文件名?组合“n_OVERWRITEPROMPT”和“n_PATHMUSTEXIST”意味着:(a)只能使用现有文件保存到中;(b) 当您指定这样一个文件时,将出现一个弹出窗口,询问“您确定要覆盖此文件吗?”(或类似的内容)。如果看不到后者,则说明您没有提供可接受的文件名。@j6t:默认文件名(“GenerateImage”)出现在文件名框中。@Adrian Mole:目的是(1)在用户要覆盖现有文件时提示;目录必须存在。但是我看到,由于文件保存对话框已经给出了目录,所以该标志没有意义。但是,删除n_PATHMUSTEXIST的
不会改变行为。文档说的是,您不应该在模式中包含空格,我没有。对不起,我错过了您指示的空格。我移除了它,但这并没有改变行为。NP。。。我们在过去版本的Windows中遇到过过滤器字符串中带有空格的问题(通常无法正确过滤文件)。可能是MFC在将其传递到“保存”对话框时“修复”了它。