【问题标题】:How can I open an *modal* file dialog with IFileOpenDialog?如何使用 IFileOpenDialog 打开 *modal* 文件对话框?
【发布时间】:2017-03-04 13:51:07
【问题描述】:

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

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

但是,在我的窗口类(CDialogImpl)中使用这段代码,我就是不知道如何使这个文件选择器成为模态。如果我使用此代码,我可以生成多个文件选择器。

当然,我可以通过添加一个代表状态的成员变量来跟踪状态,但这仍然不能解决在打开对话框时能够在主窗口中单击的问题。

有什么方法可以让我制作这个窗口模式?我一直在尝试扫描所有可用的方法,但我找不到任何东西。我没有找到任何可以在创建中传递的标志,也没有找到我可以在创建后设置的任何选项。

感谢任何帮助!

【问题讨论】:

    标签: c++ windows winapi mfc openfiledialog


    【解决方案1】:

    您链接到的示例非常简单,除了文件对话框之外没有其他 UI。您的程序更复杂,有一个从中调用文件对话框的窗口。

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

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

    所以,要解决这个问题,请将所有者、窗口句柄传递给文件对话框的Show 方法。

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

    【讨论】:

    • 这很简单。很好的解释!
    • @Sossenbinder:但请记住,API 调用经常使用错误的术语,并且所有者窗口的参数被命名为 "hParent"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2018-10-14
    • 2011-09-21
    • 2016-08-02
    相关资源
    最近更新 更多