C++ 有没有办法选择通过标准OPENFILE对话框向用户显示哪些文件?

C++ 有没有办法选择通过标准OPENFILE对话框向用户显示哪些文件?,c++,winapi,mfc,fileopendialog,C++,Winapi,Mfc,Fileopendialog,Vista引入了一个界面:IFileDialog::SetFilter,它允许我设置一个过滤器,为每个可能的文件名调用该过滤器,以查看是否应该向用户显示该文件名 微软在Windows7中删除了它,但在XP中不支持它 我正在尝试自定义“打开文件”对话框,以便可以控制向最终用户显示哪些文件。这些文件在内部用产品代码进行标记-文件名本身没有任何内容可供过滤(因此文件扩展名过滤器在这里没有用处-=我需要实际查询每个文件,以查看它是否在用户指定的额外过滤器参数内) 我猜微软删除SetFilter接口是因为

Vista引入了一个界面:IFileDialog::SetFilter,它允许我设置一个过滤器,为每个可能的文件名调用该过滤器,以查看是否应该向用户显示该文件名

微软在Windows7中删除了它,但在XP中不支持它

我正在尝试自定义“打开文件”对话框,以便可以控制向最终用户显示哪些文件。这些文件在内部用产品代码进行标记-文件名本身没有任何内容可供过滤(因此文件扩展名过滤器在这里没有用处-=我需要实际查询每个文件,以查看它是否在用户指定的额外过滤器参数内)

我猜微软删除SetFilter接口是因为它太慢了。我可以想象各种与此类似的想法,这些想法在网络和云存储以及其他方面都不能很好地扩展

但是,我需要知道是否有一个替代接口可以实现相同的目标,或者我是否真的被限制在仅查看文件扩展名,以便在文件对话框中进行过滤


跟进:
在深入研究CDN_INCLUDEITEM(它需要OPENFILENAME的vista前版本)之后,我发现这是可以想象的最无用的API。它只过滤非文件系统对象。换句话说,你不能用它来过滤文件。或文件夹。对于文件打开或保存对话框,99.99%的时间都会进行过滤。难以置信

有一种非常古老的方法,可以在每次更新列表视图时从列表视图控件中删除每个有问题的文件名

然而,从痛苦的经历中我知道列表视图会随着时间的推移而更新。如果您正在查看一个较大的文件夹(许多项目)或连接有点慢(服务器负载过大和/或文件过多),则会将文件逐段添加到对话框中。因此,必须反复过滤出有问题的文件名

事实上,我们当前的自定义文件打开对话框使用计时器定期查看视图的文件名列表,以查看是否存在任何给定模式的文件,以便启用另一个控件。否则,可以检查这些文件是否存在,也可以不查找任何文件,但稍后视图会更新为具有更多文件名,并且不会向对话框发送任何事件来指示视图已更改。事实上,我多年来为通用控件文件对话框编写和维护代码的经验是,微软对如何编写这样的东西不是很在行。事件不完整,在无用时间发送,在不必要时重复,并且不存在所有有用的通知


不幸的是,我想我可能不得不放弃这个想法。除非有人想知道,当用户试图与视图交互时,我如何能够跟上视图的自发变化(即,从列表视图中删除条目并更改用户的视觉位置、突出显示的文件或滚动位置等会很尴尬)您需要初始化CFileDialog的回调。然后您需要处理以包括或排除项


你也可以查一下。除了回调之外,作者还使用了一些其他方法

您需要为CFileDialog初始化回调。然后您需要处理以包括或排除项


你也可以查一下。除了回调之外,作者还使用了一些其他方法,正如您已经发现的那样,从Windows 7开始,不再能够根据内容(仅文件扩展名)过滤掉显示的文件。但是,您可以在允许关闭对话框之前验证用户选择的文件是否可接受,如果不能接受,则向用户显示一个消息框并保持对话框打开。除非您创建自己的自定义对话框,否则这是您所能做到的最好的方法。

正如您已经发现的,从Windows 7开始,不再能够根据内容(仅基于文件扩展名)过滤掉显示的文件。但是,您可以在允许关闭对话框之前验证用户选择的文件是否可接受,如果不能接受,则向用户显示一个消息框并保持对话框打开。除非您创建自己的自定义对话框,否则这是最好的选择。

如果您选择的是单个文件,请尝试SHBrowseForFolder with BIF_BROWSEINCLUDEFILES并将文件筛选逻辑传递给IFolderFilterSite::SetFilter.idea。我认为这对我们不起作用,因为我们已经定制了常见的“文件打开”和“另存为”对话框——因此这会增加一整套其他问题(例如,我们需要“文件类型”下拉列表)。但是在盒子外的冷静思考:)@Mordachai:你可能有一份保罗·迪拉西亚的那篇文章吗?或至少出版日期(年/月)?您提供的链接不再有效,MS search也不太友好。@Roman我希望这样做。但我不知道这是什么版本,6年多前我在这里发布这篇文章时,它已经很旧了:如果您选择的是单个文件,请尝试使用BIF_BROWSEINCLUDEFILES的SHBrowseForFolder,并将您的文件过滤逻辑传递给IFolderFilterSite::SetFilter.interest。我认为这对我们不起作用,因为我们已经定制了常见的“文件打开”和“另存为”对话框——因此这会增加一整套其他问题(例如,我们需要“文件类型”下拉列表)。但是在盒子外的冷静思考:)@Mordachai:你可能有一份保罗·迪拉西亚的那篇文章吗?或至少出版日期(年/月)?您提供的链接不再有效,MS search也不太友好。@Roman我希望这样做。但我不知道那是什么版本的,而且在我读p