2009-10-19 7 views
4

J'ai créé une instance de IExplorerBrowser dans mon code pour créer une vue d'E/S personnalisée dans l'une de mes boîtes de dialogue. J'ai implémenté les interfaces IServiceProvider et ICommDlgBrowser dans ma classe hôte. J'utilise la méthode IExplorerBrowser :: BrowseToIDList pour remplir la vue.Comment puis-je filtrer par type de fichier dans un IExplorerBrowser dans les bibliothèques Windows 7?

Je souhaite filtrer les types de fichiers affichés (par exemple, uniquement les fichiers PNG). Si j'appelle BrowseToIDList avec FOLDERID_Pictures (c'est-à-dire "Mes images"), je peux utiliser la méthode ICommDlgBrowser :: IncludeObject ou IFolderFilter :: ShouldShow pour restreindre les fichiers que j'autorise à afficher. Toutefois, si je consulte la bibliothèque d'images sous Windows 7 (FOLDERID_PicturesLibrary), ICommDlgBrowser :: IncludeObject et IFolderFilter :: ShouldShow ne sont jamais appelés.

Y a-t-il des limites au filtrage des fichiers dans les bibliothèques sur Win7 dont je ne suis pas conscient? Peut-être qu'il me manque une interface ou peut-être que j'ai spécifié le mauvais drapeau quelque part.

Toutes les idées seraient grandement appréciées.

+0

[Cela m'a pris un certain temps] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb761909%28v=vs.85%29.aspx): "Notez que le le client ne reçoit pas un appel à 'ICommDlgBrowser :: IncludeObject' si un filtre de dossier a été défini sur le navigateur par un appel à' IFolderFilterSite :: SetFilter'. " –

Répondre

2

J'ai eu l'occasion de faire des recherches plus approfondies, notamment en posant quelques questions à certains développeurs de Microsoft. Il semblerait, malheureusement, que le filtrage ne fonctionne pas avec les vues sauvegardées par requête (c'est-à-dire les bibliothèques).

Une alternative à mon approche serait d'utiliser la boîte de dialogue Common Item avec les contrôles ajoutés par l'application (via IFileDialogCustomize).

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

Dans mon cas particulier, je suis incapable d'utiliser un élément commun de dialogue, mais je pense qu'il pourrait être utile de publier cette information pour référence ultérieure.

Si à l'avenir je trouve un moyen de filtrer un contrôle IExplorerBrowser, je le publierai ici aussi.

1

J'ai moi-même rencontré ce problème.

Pourtant, j'ai enquêté un peu plus loin. IExplorerBrowser crée (sur ma machine Windows 7 x64) la fenêtre de la classe ExplorerBrowserControl. Qui crée lui-même une fenêtre de classe DUIViewWndClassName. Et la même fenêtre (DUIViewWndClassName) est utilisée comme un contrôle par le dialogue créé par IFileOpenDialog. Même les procédures de fenêtre sont identiques, donc il n'y a pas de sous-classe (mais je n'ai pas vérifié chaque sous-fenêtre de ce contrôle).

Et les boîtes de dialogue de fichiers peuvent filtrer par type de fichier même dans les dossiers de la bibliothèque. Donc, je suppose que le IExplorerBrowser (ou le contrôle qu'il utilise) permet que seul Microsoft ne partage pas ses connaissances sur la façon de le faire. Ou si c'est le cas, sa connaissance quelque peu cachée.

Mais je l'ai eu avec IFolderFilterSite (interface prise en charge par IExplorerBrowser de CLSID_ExplorerBrowser). IFolderFilter::ShouldShow n'est pas appelé dans de tels cas pour les dossiers de bibliothèque. Je n'étais pas en mesure d'obtenir ICommDlgBrowser::IncludeObject appelé (même si je n'ai pas défini IFolderFilter).


EDIT: J'ai réussi à obtenir ICommDlgBrowser::IncludeObject appelé. Quelque part, j'ai oublié que je dois fournir ICommDlgBrowser par IServiceProvider::QueryService plutôt que par IUnknown::QueryInterface. Mais toujours ICommDlgBrowser::IncludeObject n'est pas appelé pour les dossiers de la bibliothèque.

+1

J'ai fait quelques expériences supplémentaires (encore infructueuses) et j'ai posé la question sur le forum MSDN: http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/252a9c82-617c-4126-8347-56dcedb4342f . –

-1

J'ai essayé d'utiliser IShellFolderViewDual3-> FilterView().
Mais ce sont les résultats de recherche.
Merci.

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);

+2

Le but de cette publication n'est pas clair. S'il vous plaît ajouter quelques explications. Voulez-vous dire que c'est une solution à la question? Ou demandez-vous de l'aide pour un problème similaire? – AdrianHHH

Questions connexes