0

使用 CFileDialog 作为文件打开,我需要允许用户只选择显示在对话框列表区域中的文件,例如通过单击它。我们不希望用户能够在 File Name 控件中键入名称。OPENFILENAME (OFN) 结构有几个不同的标志(http://msdn.microsoft.com/en-US/library/ms646839%28v=vs.80%29.aspx),但我没有看到一个可以阻止用户输入文件名。

我看到的最接近的是OFN_FILEMUSTEXIST,但它只指定文件存在;它仍然允许用户输入名称。

有没有办法在不继承新类的情况下做到这一点?

更多信息

我们需要防止他们输入文件名,因为他们可能会打开不合适的文件名。使用该lpszFilter参数,我们过滤文件名,因此它只显示文件名中带有ABC的文件(而不是扩展名)。因此,如果他们输入文件名,他们可以输入类似myCoolFileDEF.ext. 如果文件存在,它将继续并让他们打开它(对话框将关闭而没有错误消息),即使他们只应该打开文件名中带有ABC的文件。

4

2 回答 2

2

由于您使用的是 MFC,因此只需继承一个 CFileDialog 并禁用文件名编辑控件和组合框。我看不出使用 CFileDialog 和编写另一个 OFNHookProc 回调的意义,但如果你愿意,你可以从GetOpenFileName开始。

于 2013-04-10T22:28:07.907 回答
2

作为先前的答案,您可以在对话框中查找文件名控件并将其禁用。不过,这并非没有惩罚 - 如果您打开 CFileDialog 挂钩回调逻辑,您会在 Vista 及更高版本上获得“旧样式”文件对话框,而不是“新样式”对话框。“新样式”文件对话框在可以自定义的内容方面受到更多限制,并且据我所知,它不提供获取文件名控件的受支持方式。

阅读你的问题,我的第一直觉是你过度设计了你的解决方案:如果你提供一个过滤器,那么用户必须很麻烦才能选择错误的文件类型,而大多数用户不会这样做那。如果他们这样做,则用户可能比您的程序更了解。如果是我,我只会使用过滤器,然后在文件对话框关闭后,检查返回的文件名 - 如果它与所需的模式不匹配,我会发出一个消息对话框询问用户是否他们'真的确定,如果他们坚持要打开文件,无论如何都要打开文件。

于 2013-04-11T06:51:55.880 回答