4

コードにIExplorerBrowserのインスタンスを作成して、ダイアログの1つにカスタムI/Oビューを作成しました。ホストクラスにIServiceProviderインターフェイスとICommDlgBrowserインターフェイスを実装しました。IExplorerBrowser::BrowseToIDListメソッドを使用してビューを塗りつぶします。

表示されるファイルタイプをフィルタリングしたい(例:PNGファイルのみ)。FOLDERID_Pictures (つまり「MyPictures」)を指定してBrowseToIDListを呼び出すと、ICommDlgBrowser::IncludeObjectメソッドまたはIFolderFilter::ShouldShowを使用して、表示を許可するファイルを制限できます。ただし、Windows 7で画像ライブラリ(FOLDERID_PicturesLibrary)を参照すると、ICommDlgBrowser::IncludeObjectもIFolderFilter::ShouldShowも呼び出されません。

私が知らないWin7のライブラリ内のファイルのフィルタリングにいくつかの制限はありますか?インターフェースがないか、どこかに間違ったフラグを指定した可能性があります。

任意のアイデアをいただければ幸いです。

4

3 に答える 3

2

Microsoft の開発者にいくつか質問するなど、これをさらに調査する機会がありました。残念ながら、フィルタリングはクエリに基づくビュー (つまりライブラリ) では機能しないようです。

私のアプローチに代わる方法は、(IFileDialogCustomize を介して) アプリケーションにコントロールを追加した Common Item Dialog を使用することです。

( 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(またはそれが使用するコントロール) は、Microsoft だけがそれを行う方法の知識を共有しないことを許可していると思います。または、そうであれば、そのやや隠された知識です。

しかし、私は( from でIFolderFilterSiteサポートされているインターフェース)でそれを手に入れました。このような場合、ライブラリ フォルダーに対しては呼び出されません。呼び出されませんでした(設定していなくても)。IExplorerBrowserCLSID_ExplorerBrowserIFolderFilter::ShouldShowICommDlgBrowser::IncludeObjectIFolderFilter


編集:私はなんとかICommDlgBrowser::IncludeObject呼ばれました。ICommDlgBrowserを通じてIServiceProvider::QueryServiceではなく、を通じて提供する必要があることをどういうわけか忘れていました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 に答える