4

我在我的代码中创建了一个 IExplorerBrowser 实例,以便在我的一个对话框中创建一个自定义 I/O 视图。我已经在我的宿主类中实现了 IServiceProvider 和 ICommDlgBrowser 接口。我使用 IExplorerBrowser::BrowseToIDList 方法来填充视图。

我想过滤显示的文件类型(例如仅 PNG 文件)。如果我用FOLDERID_Pictures(即“我的图片”)调用 BrowseToIDList,我可以使用 ICommDlgBrowser::IncludeObject 方法或 IFolderFilter::ShouldShow 来限制允许显示的文件。但是,如果我浏览到 Windows 7 ( FOLDERID_PicturesLibrary ) 上的图片库,则 ICommDlgBrowser::IncludeObject 和 IFolderFilter::ShouldShow 都不会被调用。

在我不知道的 Win7 库中过滤文件是否有一些限制?也许我错过了一个界面,或者我在某处指定了错误的标志。

任何想法将不胜感激。

4

3 回答 3

2

我有机会对此进行了进一步研究,包括向一些 Microsoft 开发人员提出了一些问题。不幸的是,过滤似乎不适用于查询支持的视图(即库)。

我的方法的替代方法是使用带有应用程序添加控件的公共项目对话框(通过 IFileDialogCustomize)。

( http://msdn.microsoft.com/en-us/library/bb776913(VS.85).aspx )

在我的具体情况下,我无法使用通用项目对话框,但我认为在此处发布此信息以供将来参考可能是值得的。

如果将来我找到任何过滤 IExplorerBrowser 控件的方法,我也会在此处发布。

于 2009-11-05T04:15:07.543 回答
1

我自己也遇到过这个问题。

然而,我已经进一步调查了它。IExplorerBrowser创建(在我的 Windows 7 x64 机器上)ExplorerBrowserControl类窗口。它本身创建了一个DUIViewWndClassName类窗口。并且相同的窗口 ( DUIViewWndClassName) 被用作由IFileOpenDialog. 甚至窗口过程都是相同的,因此没有子类化(但我没有检查该控件的每个子窗口)。

即使在库文件夹中,文件对话框也能够按文件类型进行过滤。所以我猜想IExplorerBrowser(或它使用的控件)确实允许只有微软不分享如何做到这一点的知识。或者,如果确实如此,那么它有些隐藏的知识。

但我得到了它(由fromIFolderFilterSite支持的接口)。在这种情况下不会为库文件夹调用。我无法被调用(即使我没有设置任何)。IExplorerBrowserCLSID_ExplorerBrowserIFolderFilter::ShouldShowICommDlgBrowser::IncludeObjectIFolderFilter


编辑:我设法ICommDlgBrowser::IncludeObject被叫了。不知何故,我忘记了我必须提供ICommDlgBrowserthroughIServiceProvider::QueryService而不是 through IUnknown::QueryInterface。但仍然ICommDlgBrowser::IncludeObject不要求库文件夹。

于 2011-08-26T13:56:07.040 回答
-1

我尝试使用 IShellFolderViewDual3->FilterView()。
但这是搜索结果。
谢谢你。

IShellView *pShellView;
IDispatch *pDSFV;
IShellFolderViewDual3 *pSFVD3;

m_pExplorerBrowser->GetCurrentView(IID_PPV_ARGS(&pShellView));
pShellView->GetItemObject(SVGIO_BACKGROUND, IID_PPV_ARGS(&pDSFV));
pDSFV->QueryInterface(IID_PPV_ARGS(&pSFVD3));
pSFVD3->FilterView(bstrVal);

于 2014-02-09T13:35:11.813 回答