如何使用 IFileOpenDialog 打开 *modal* 文件对话框?

How can I open an *modal* file dialog with IFileOpenDialog?

一段时间以来,我一直在尝试在我的 C++ 应用程序中实现一个文件对话框,并且我使用本文中描述的代码取得了很好的成功(它是德语,但代码应该是可以理解的):

https://msdn.microsoft.com/de-de/library/windows/desktop/ff485843(v=vs.85).aspx

但是,在我的 window class 中使用这段代码,它是一个 CDialogImpl,我只是找不到如何使这个文件选择器模式化。如果我使用这段代码,我可以生成多个文件选择器。

当然,我可以通过添加一个表示状态的成员变量来跟踪状态,但是它仍然不能解决在主window 对话框中可以点击的问题已打开。

有什么方法可以使这个 window 模态化吗?我一直在尝试扫描所有可用的方法,但我找不到任何东西。我没有找到任何可以在创建时传递的标志,也没有找到任何我可以在创建后设置的选项。

感谢任何帮助!

您 link 的示例非常简单,除了文件对话框外没有 UI。您的程序更复杂,有一个 window 从中调用文件对话框。

您需要为文件对话框提供所有者。当您这样做时,所有者将被禁用,这是使对话框成为模态的部分原因。未能通过所有者意味着其他 windows 未被禁用,因此仍然响应用户输入。

示例代码没有提供所有者,但由于该程序中没有其他 windows,所以这是良性的。模态只有在有多个 windows 时才有意义。

因此,要解决此问题,请将所有者,即您的 window 的句柄传递给文件对话框的 Show 方法。

禁用所有者 windows 是模态对话框的关键部分之一。您会发现模态对话框的任何 API 都希望您指定所有者。养成期望提供 ownwr window 并寻找这样做的方法的习惯。