mfccfiledialog只打开选定的文件

MFC CFileDialog open only select files

本文关键字:文件 mfccfiledialog      更新时间:2023-10-16

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

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

有没有办法做到这一点,而不继承一个新的类?

更多信息

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

由于您正在使用MFC,只需继承CFileDialog并禁用文件名编辑控件和组合框。我不认为使用CFileDialog和编写另一个OFNHookProc回调的意义,虽然你可以从GetOpenFileName开始,如果你想。

正如前面的回答所指出的,您可以在对话框中查找文件名控件并禁用它。这不是没有惩罚-如果你打开CFileDialog钩子回调逻辑,你得到的是"旧风格"的文件对话框在Vista和以上版本,而不是"新风格"的一个。"new style"文件对话框在可定制的内容方面有很多限制,而且,据我所知,它没有提供一种受支持的方式来获取文件名控制。

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