MFC CFileDialog仅打开选择文件

时间:2013-04-10 20:38:20

标签: c++ visual-c++ mfc

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

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

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

更多信息

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

2 个答案:

答案 0 :(得分:2)

由于您使用的是MFC,只需inherit a CFileDialog and disable the file name edit control and combobox。我没有看到使用CFileDialog并编写另一个OFNHookProc回调的重点,但如果你愿意,你可以从GetOpenFileName开始。

答案 1 :(得分:2)

如前面的答案所述,您可以在文件名控件的对话框中查找并禁用它。这不是没有惩罚 - 如果你打开CFileDialog钩子回调逻辑,你得到Vista及以上的“旧式”文件对话框,而不是“新式”。 “新风格”文件对话框在可自定义的内容中有更多限制,据我所知,它不提供获取文件名控件的支持方式。

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