2013-04-10 79 views
0

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

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

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

更多信息

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

回答

2

正如以前的答案注释,您可以在对话框中为根文件名控制并将其禁用。这不是没有惩罚 - 如果你打开CFileDialog钩子回调逻辑,你会在Vista和更高版本上获得“旧式”文件对话框,而不是“新风格”。 “新风格”文件对话框对于可定制的内容限制更多,并且据我所知,它不提供受支持的方式来获得文件名控制权。

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

+2

我同意 - 你打败了我的答案,但!通过在*文件名提示符之后放置验证逻辑*,您还可以重用它,例如验证命令行中提供的文件名或通过拖放操作。 – 2013-04-11 07:09:58