【问题标题】:CFileDialog "Save" button does not return from DoModalCFileDialog“保存”按钮不从 DoModal 返回
【发布时间】:2021-07-14 01:19:33
【问题描述】:

使用下面的代码,文件保存对话框按预期显示,带有两个按钮:保存和取消。单击 Cancel 将返回 result=IDCANCEL,但单击 Save 或键入 Enter 不会从 DoModal 返回,只是重新绘制 Filename 窗口。是否有任何原因“保存”按钮不起作用?

// 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 上运行的结果相同)。

【问题讨论】:

  • OFN_PATHMUSTEXIST 在保存对话框中看起来很奇怪。在单击“保存”之前,您实际上指定了文件名吗?
  • OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST 的组合意味着: (a) 您只能使用现有文件保存到; (b) 当你指定这样一个文件时,你会得到一个弹出窗口询问,“你确定要覆盖这个文件吗?” (或类似的东西)。如果您没有看到后者,那么您没有给出可接受的文件名。
  • @j6t:默认文件名(“GeneratedImage”)出现在文件名框中。
  • @Adrian Mole:目的是(1)提示用户是否要覆盖现有文件; (2) 目录必须存在。但是我看到,由于“文件保存”对话框已经给出了目录,因此该标志没有意义。但是,删除 OFN_PATHMUSTEXIST 不会改变行为。

标签: c++ cfiledialog


【解决方案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

【讨论】:

  • 文档说你不应该在模式中包含空格,我没有。
  • 对不起,我错过了你指出的空间。我删除了它,但这并没有改变行为。
  • NP... 我们在过去版本的 Windows 中遇到了过滤字符串中有空格的问题(通常不会正确过滤文件)。可能是 MFC 在将其传递给保存对话框时“修复”它。
【解决方案2】:

找到了问题,有点。显然您无法将文件保存到库中。

在 Windows 7 中,导航到左侧窗格中的库/文档会在右侧窗格中显示“文档库,包括 2 个位置”。然后,单击保存什么也不做。如果选择了不同的另存为类型,我可以保存。

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

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

也许有人知道CFileDialog的功能在哪里详细描述了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2017-04-07
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多