Implémentation d’un affichage des dossiers

Windows L’interpréteur de commandes fournit une implémentation par défaut de l’affichage des dossiers, connu sous le nom de DefView, ce qui vous permet d’éviter une grande partie du travail d’implémentation de votre propre extension d’espace de noms. Étant donné que certaines fonctionnalités de vue ne peuvent pas être obtenues par le biais de vues personnalisées, il est souvent recommandé d’utiliser l’objet de vue de dossier système par défaut à la place d’une vue personnalisée. Pour plus d’informations, consultez SHCreateShellFolderView. Le reste de cette rubrique traite de l’implémentation d’une vue de dossier personnalisée qui ne prend pas en charge les fonctionnalités d’affichage plus récentes.

contrairement à l’arborescence, Windows Explorer ne gère pas le contenu d’une vue de dossier. Au lieu de cela, la fenêtre d’affichage des dossiers héberge une fenêtre enfant qui est fournie par l’objet dossier. L’objet Folder est chargé de créer un objet d’affichage des dossiers pour afficher le contenu du dossier dans la fenêtre enfant.

La clé de l’implémentation d’un objet de vue de dossier est l’interface IShellView . cette interface est utilisée par Windows Explorer pour communiquer avec l’objet de vue de dossier. avant d’afficher un affichage des dossiers, Windows Explorer appelle la méthode IShellFolder :: CreateViewObject de l’objet folder avec riid défini sur IID _ IShellView. Créez un objet de vue de dossier et retournez son interface IShellView . L’objet de vue de dossier doit ensuite créer une fenêtre enfant de la fenêtre d’affichage des dossiers et utiliser la fenêtre enfant pour afficher des informations sur le contenu du dossier.

outre le contrôle de l’affichage des données, les extensions peuvent également personnaliser un certain nombre de fonctionnalités de Windows Explorer. Par exemple, une extension peut ajouter des éléments à la barre d’outils ou à la barre de menus, ou afficher des informations sur la barre d’État.

Objet de l’affichage des dossiers

Un objet de vue de dossier est un objet COM (Component Object Model) qui expose une interface IShellView . Cet objet est chargé des opérations suivantes :

  • Création d’une fenêtre enfant de la fenêtre d’affichage des dossiers et utilisation de celle-ci pour afficher le contenu du dossier.
  • gestion de la communication avec l’explorateur de Windows.
  • ajout de commandes spécifiques aux dossiers dans la barre de menus et la barre d’outils de l’explorateur de Windows et gestion de ces commandes lorsqu’elles sont sélectionnées.
  • Gestion de l’interaction de l’utilisateur à l’aide de la fenêtre d’affichage des dossiers, telle que l’affichage des menus contextuels ou la gestion des opérations de glisser-déplacer.

Ce document traite des trois premières rubriques. Étant donné que l’interaction de l’utilisateur avec l’affichage des dossiers s’effectue dans votre fenêtre enfant, votre objet de vue de dossier est chargé de le gérer comme n’importe quelle autre fenêtre.

Windows L’Explorateur demande un objet de vue de dossier en appelant le IShellFolder :: CreateViewObject de l’objet Folder avec riid défini sur IID _ IShellView. La procédure de création d’un affichage des dossiers est la suivante :

  1. Votre objet Folder crée une nouvelle instance de votre objet de vue de dossier et retourne un pointeur vers son interface IShellView .
  2. Windows L’Explorateur Initialise l’objet d’affichage des dossiers en appelant la méthode IShellView :: CreateViewWindow . crée une fenêtre enfant de la fenêtre d’affichage des dossiers et retourne son handle à Windows Explorer.
  3. l’objet d’affichage des dossiers utilise l’interface IShellBrowser de l’explorateur de Windows pour personnaliser la barre d’outils de l’explorateur de Windows, la barre de menus et la barre d’état.
  4. L’objet d’affichage des dossiers affiche le contenu du dossier dans la fenêtre enfant.
  5. L’objet d’affichage des dossiers gère l’interaction de l’utilisateur avec l’affichage des dossiers et les éléments de barre de menus ou de barre d’outils spécifiques aux dossiers.

Initialisation de l’objet de vue de dossier

Windows L’Explorateur Initialise l’objet d’affichage des dossiers en appelant la méthode IShellView :: CreateViewWindow . Les paramètres de la méthode fournissent à l’objet de vue de dossier les informations dont il a besoin pour créer la fenêtre enfant qui sera utilisée pour afficher le contenu du dossier :

  • Pointeur vers l’interface IShellView de l’objet d’affichage du dossier précédent. Ce paramètre peut avoir la valeur null.
  • Structure FOLDERSETTINGS qui contient les paramètres de la vue de dossier précédente.
  • pointeur vers l’interface IShellBrowser de l’explorateur de Windows.
  • Une structure Rect avec les dimensions de la fenêtre d’affichage des dossiers.

La méthode IShellView :: CreateViewWindow est appelée avant la destruction de l’objet de vue de dossier précédent. Le pointeur d’interface IShellView vous permet donc de communiquer avec l’objet d’affichage de dossier précédent. Cette interface est surtout utile si le dossier précédent appartenait à votre extension et utilisait le même schéma d’affichage. Dans ce cas, vous pouvez communiquer avec l’objet d’affichage de dossier précédent à des fins telles que l’échange de paramètres privés.

Un moyen simple de déterminer si le pointeur IShellView appartient à votre extension est de faire en sorte que tous vos objets de vue de dossier exposent une interface privée. Appelez IShellView :: QueryInterface pour demander l’interface privée, puis examinez la valeur de retour pour déterminer si l’objet de la vue du dossier est l’un des vôtres. Vous pouvez ensuite utiliser une méthode privée sur cette interface pour échanger des informations.

La structure FOLDERSETTINGS contient les paramètres d’affichage du dossier précédent. Le paramètre principal est le mode d’affichage : grande icône, petite icône, liste ou détails. Il y a également un indicateur qui contient les paramètres d’une variété d’options d’affichage, par exemple si la vue doit être alignée à gauche. L’affichage de vos dossiers doit respecter ces paramètres dans la mesure du possible, afin de fournir aux utilisateurs une expérience cohérente lorsqu’ils passent d’un dossier à un autre. Vous devez stocker cette structure et la mettre à jour en fonction des modifications apportées aux paramètres. Windows L’Explorateur appelle IShellView :: GetCurrentInfo pour obtenir la valeur la plus récente de cette structure avant d’ouvrir l’affichage suivant du dossier.

l’interface IShellBrowser est exposée par Windows Explorer. cette interface est associée à IShellView et permet à un objet de vue de dossier de communiquer avec Windows Explorer. Il n’existe aucune autre façon de récupérer ce pointeur d’interface, votre objet de vue de dossier doit donc le stocker pour une utilisation ultérieure. En particulier, vous devez appeler IShellBrowser :: GetWindow pour récupérer la fenêtre d’affichage du dossier parent que vous allez utiliser pour créer votre fenêtre enfant. Notez que la méthode IShellBrowser :: GetWindow n’est pas incluse dans la documentation IShellBrowser , car elle est héritée de IOleWindow. Après avoir stocké le pointeur d’interface, n’oubliez pas d’appeler IShellBrowser :: AddRef pour incrémenter le décompte de références de l’interface. Lorsque vous n’avez plus besoin de l’interface, appelez IShellBrowser :: Release.

Pour créer votre fenêtre enfant :

  1. Examinez les structures FOLDERSETTINGS et Rect .
  2. Si nécessaire, obtenez des paramètres privés à partir de l’objet d’affichage du dossier précédent.
  3. Appelez IShellBrowser :: GetWindow pour récupérer la fenêtre d’affichage du dossier parent.
  4. créez un enfant de la fenêtre d’affichage des dossiers obtenue à l’étape précédente et renvoyez-le à Windows Explorer.

Affichage de l’affichage des dossiers

une fois que vous avez créé la fenêtre enfant et que vous l’avez retournée à Windows Explorer, vous pouvez afficher le contenu du dossier. En règle générale, les extensions affichent leurs informations en faisant en sorte que la fenêtre enfant héberge soit un contrôle List View , soit un contrôle WebBrowser. le contrôle list view vous permet de répliquer l' affichage classiquede Windows Explorer. le contrôle WebBrowser vous permet d’utiliser un document dhtml (Dynamic HTML) pour afficher vos informations, de la même façon que l’affichage Web de l’explorateur de Windows. Pour plus d’informations, reportez-vous à la documentation de ces contrôles.

La fenêtre d’affichage des dossiers existe toujours, même si elle n’a pas le focus. Vous devez donc conserver trois États pour votre fenêtre enfant :

  • Activé avec focus. L’affichage des dossiers a été créé et a le focus. Définissez la barre de menus ou les éléments de barre d’outils qui conviennent à un État ciblé.
  • Activé sans focus. L’affichage des dossiers a été créé et est actif, mais il n’a pas le focus. Définissez la barre de menus ou les éléments de barre d’outils qui conviennent à un État sans focus. Omettez tous les éléments qui s’appliquent à la sélection d’éléments dans l’affichage des dossiers.
  • Désactivé. L’affichage des dossiers va être détruit. Supprimer tous les éléments de menu spécifiques au dossier.

Windows L’Explorateur avertit votre objet de vue de dossier lorsque l’état de la fenêtre change en appelant IShellView :: UIActivate. à son tour, l’objet d’affichage des dossiers doit notifier Windows Explorer lorsqu’un utilisateur active la fenêtre d’affichage des dossiers en appelant IShellBrowser :: OnViewWindowActive. pour plus d’informations sur cette interface, consultez utilisation de IShellBrowser pour communiquer avec l’explorateur de Windows.

lorsque l’affichage des dossiers est actif, vous devez traiter tous les messages de Windows, tels que la _ taille du WM, qui appartiennent à votre fenêtre enfant. votre procédure de fenêtre recevra également les messages de _ commande WM pour tous les éléments que vous avez ajoutés à la barre de menus ou à la barre d’outils de l’explorateur de Windows.

après avoir créé l’affichage des dossiers, Windows Explorer appelle l’interface IShellView de l’objet affichage des dossiers pour lui transmettre diverses informations. Votre objet doit modifier son affichage en conséquence. lorsque l’affichage des dossiers va être détruit, Windows Explorer avertit l’objet de la vue du dossier en appelant sa méthode IShellView ::D estroyviewwindow .

Implémentation de IShellView

une fois l’objet dossier créé, Windows Explorer appelle différentes méthodes IShellView pour demander des informations ou notifier l’objet d’une modification de l’état de Windows Explorer. Cette section décrit comment implémenter ces méthodes IShellView . Les méthodes restantes sont utilisées à des fins plus spécialisées, telles que la boîte de dialogue Ouvrir un fichier commun. Pour plus d’informations, consultez la documentation IShellView .

AddPropertySheetPages

quand un utilisateur sélectionne des options de dossier dans le menu outils de l’explorateur de Windows, une feuille de propriétés s’affiche et permet à l’utilisateur de modifier les Options des dossiers. Windows L’Explorateur appelle la méthode IShellView :: AddPropertySheetPages de l’objet affichage des dossiers pour vous permettre d’ajouter une page à cette feuille de propriétés.

Windows L’Explorateur passe un pointeur vers une fonction de rappel AddPropSheetPageProc dans le paramètre lpfn de IShellView :: AddPropertySheetPages. Appelez CreatePropertySheetPage pour créer la page, puis appelez AddPropSheetPageProc pour l’ajouter à la feuille de propriétés. Pour plus d’informations sur la façon de gérer les feuilles de propriétés, consultez feuilles de propriétés.

GetCurrentInfo

lorsque l’utilisateur passe d’un dossier à un autre, Windows Explorer tente de maintenir un affichage de dossier similaire. Par exemple, si l’affichage du dossier précédent affichait de grandes icônes, le prochain devrait également. quand Windows Explorer appelle IShellView :: CreateViewWindow pour initialiser votre objet de vue de dossier, la méthode reçoit une structure FOLDERSETTINGS . Cette structure contient des informations qui vous permettent de rendre votre affichage des dossiers cohérent avec l’affichage du dossier précédent.

Pour vous assurer que la vue suivante est cohérente avec la vue actuelle, stockez la structure FOLDERSETTINGS . Si la vue change, par exemple de grande taille à petite icône, mettez à jour la structure en conséquence. avant de basculer entre les affichages, Windows Explorer appellera IShellView :: GetCurrentInfo pour demander les valeurs actuelles de FOLDERSETTINGS pour les passer à l’objet de vue de dossier suivant.

Actualiser

L’utilisateur peut s’assurer que l’affichage des dossiers reflète l’état actuel du dossier en sélectionnant Actualiser dans le menu affichage ou en appuyant sur la touche F5. lorsque l’utilisateur le fait, Windows Explorer appelle la méthode IShellView :: Refresh . Votre objet de vue de dossier doit immédiatement mettre à jour l’affichage du dossier.

SaveViewState

Windows L’Explorateur appelle la méthode IShellView :: SaveViewState pour inviter votre objet de vue de dossier à enregistrer son état d’affichage. Vous pouvez ensuite récupérer l’état lors de la prochaine consultation du dossier. Pour enregistrer un état d’affichage, il est préférable d’appeler la méthode IShellBrowser :: GetViewStateStream . Cette méthode retourne une interface IStream que votre objet d’affichage des dossiers peut utiliser pour enregistrer son état. Lorsque vous créez un autre affichage des dossiers, vous pouvez appeler la même méthode IShellBrowser :: GetViewStateStream pour obtenir un pointeur IStream qui vous permet de lire les paramètres enregistrés par les affichages des dossiers précédents.

TranslateAcelerator

quand l’utilisateur appuie sur une touche de raccourci, Windows Explorer transmet le message à l’objet d’affichage des dossiers en appelant IShellView :: TranslateAccelerator. retourne _ la valeur false pour que Windows Explorer traite le message. Si votre objet de vue de dossier a traité le message, renvoyez _ OK.

lorsque la fenêtre d’affichage des dossiers a le focus, Windows Explorer appelle IShellView :: TranslateAccelerator avant de traiter le message. étant donné que la plupart des messages sont généralement associés à des commandes de barre de menus ou de barre d’outils Windows Explorer, votre objet de vue de dossier doit normalement retourner S _ false. Windows L’Explorateur peut ensuite traiter le message normalement. return _ OK uniquement si le message est spécifique à un dossier et que vous ne souhaitez pas que Windows Explorer effectue un traitement supplémentaire. si l’affichage des dossiers n’a pas le focus, Windows Explorer traite le message en premier. Elle appelle IShellBrowser :: TranslateAcceleratorSB uniquement si elle ne gère pas le message.

utilisation de IShellBrowser pour communiquer avec l’explorateur de Windows

l’interface IShellBrowser est utilisée par l’objet d’affichage des dossiers pour communiquer avec Windows Explorer à diverses fins, notamment :

modification de la barre de menus de l’explorateur de Windows

la barre de menus de l’explorateur de Windows permet à l’utilisateur de lancer une série de commandes. par défaut, la barre de menus ne prend en charge que les commandes spécifiques à Windows Explorer. les messages de _ commande WM associés sont traités par Windows Explorer et ne sont pas passés à votre objet de vue de dossier. Toutefois, vous pouvez modifier la barre de menus pour inclure un ou plusieurs éléments de menu spécifiques à un dossier avec IShellBrowser. Windows L’Explorateur passe les _ messages de commande WM associés à ces éléments à la procédure de fenêtre de votre objet dossier pour traitement. Vous pouvez également supprimer ou désactiver toutes les commandes standard qui ne s’appliquent pas à votre application.

Les objets d’affichage des dossiers modifient généralement la barre de menus avant l’affichage du dossier. Ils doivent retourner la barre de menus à son état d’origine lorsque l’affichage des dossiers est détruit. Vous devrez peut-être également modifier la barre de menus chaque fois que votre vue de dossier gagne ou perd le focus.

comme Windows Explorer appelle IShellView :: UIActivate chaque fois que l’état de la fenêtre d’affichage des dossiers change, la modification de la barre de menus est normalement incluse dans l’implémentation de cette méthode. la procédure de base pour modifier la barre de menus de l’explorateur de Windows est la suivante :

  1. Appelez CreateMenu pour créer un handle de menu.
  2. transmettez ce handle de menu à Windows Explorer en appelant IShellBrowser :: InsertMenusSB. Windows L’Explorateur affiche ses informations de menu.
  3. Modifiez le menu en fonction des besoins.
  4. appelez IShellBrowser :: SetMenuSB pour que Windows Explorer affiche la barre de menus modifiée.

Windows L’Explorateur comporte six menus contextuels sur sa barre de menus. comme avec tous les conteneurs OLE, le menu de l’explorateur de Windows est divisé en six groupes : fichier, modifier, conteneur, objet, fenêtre et aide. le tableau suivant répertorie les menus contextuels de Windows Explorer et le groupe qui leur est associé, ainsi que les id de menu.

Menu contextuel id Group
Fichier _fichier de menu FCIDM _ Fichier
Modifier FCIDM _ menu _ Edition Fichier
Affichage _affichage du menu FCIDM _ Conteneur
Favoris FCIDM _ menu _ favoris Conteneur
Outils _outils de menu FCIDM _ Conteneur
Aide _aide du menu FCIDM _ Fenêtre

quand vous transmettez le descripteur de menu à Windows Explorer en appelant IShellBrowser :: InsertMenusSB, vous devez également passer un pointeur vers une structure OLEMENUGROUPWIDTHS dont les membres ont été initialisés à zéro.

quand IShellBrowser :: InsertMenusSB est retourné, Windows Explorer aura ajouté ses éléments de menu. vous pouvez ensuite utiliser le handle de menu retourné avec les fonctions de menu de Windows standard, telles que InsertMenuItem , pour :

  • ajoutez des éléments aux menus contextuels de l’explorateur de Windows.
  • modifiez ou supprimez des éléments existants dans les menus contextuels de l’explorateur de Windows.
  • Ajoutez de nouveaux menus contextuels.

utilisez les id figurant dans le tableau pour identifier les différents menus contextuels de l’explorateur de Windows.

Notes

pour éviter les conflits avec les id de commande de l’explorateur de Windows, les id des éléments de menu que vous ajoutez doivent être compris entre FCIDM _ SHVIEWFIRST et FCIDM _ SHVIEWLAST. Ces deux valeurs sont définies dans shlobj. h.

une fois que vous avez fini de modifier le menu, appelez IShellBrowser :: SetMenuSB pour que Windows Explorer affiche la nouvelle barre de menus.

une fois l’affichage des dossiers initialement affiché, Windows Explorer appelle IShellView :: UIActivate chaque fois que l’affichage des dossiers gagne ou perd le focus. Si vous avez des éléments de menu qui sont sensibles à l’état de l’affichage des dossiers, vous devez modifier le menu en conséquence, chaque fois que l’état change. Par exemple, vous pouvez avoir un élément de menu qui agit sur un élément dans l’affichage des dossiers qui a été sélectionné par l’utilisateur. Vous devez désactiver ou supprimer cet élément de menu lorsque l’affichage des dossiers perd le focus.

quand Windows Explorer appelle IShellView :: UIActivate pour indiquer que l’affichage des dossiers est désactivé, restaurez la barre de menus à son état d’origine en appelant IShellBrowser :: RemoveMenusSB.

modification de la barre d’outils de l’explorateur de Windows

en plus de modifier la barre de menus de l’explorateur de Windows, vous pouvez également ajouter des boutons à la barre d’outils. Comme avec la barre de menus, la modification de la barre d’outils fait généralement partie de l’implémentation de IShellView :: UIActivate . la procédure d’ajout de boutons à la barre d’outils de Windows Explorer est la suivante :

  1. Ajoutez l’image bitmap du bouton à la liste d’images de la barre d’outils.
  2. Définissez la chaîne de texte du bouton.
  3. Ajoutez le bouton à la barre d’outils.

Pour ajouter une image bitmap à la liste d’images d’une barre d’outils, envoyez la barre d’outils à un message _ ADDBITMAP to en appelant IShellBrowser :: SendControlMsg. Pour spécifier le contrôle ToolBar, définissez le paramètre ID de la méthode sur la _ barre d’outils FCW. Définissez wParam sur le nombre d’images de bouton dans l’image bitmap et lParam sur l’adresse d’une structure TBADDBITMAP . L’index d’image est retourné dans le paramètre pret .

Il existe deux façons de définir une chaîne pour le bouton :

  • Assignez la chaîne au membre iString de la structure TBBUTTON du bouton.
  • Appelez IShellBrowser :: SendControlMsg pour envoyer le contrôle de barre d’outils à un message _ ADDSTRING to . Le paramètre wParam doit être défini sur zéro et le paramètre lParam sur la chaîne. L’index de chaîne est retourné dans le paramètre pret .

Pour ajouter le bouton à la barre d’outils, remplissez une structure TBBUTTON et transmettez-la à IShellBrowser :: SetToolbarItems. Comme avec le menu, votre ID de commande doit se situer entre FCIDM _ SHVIEWFIRST et FCIDM _ SHVIEWLAST. La barre d’outils ajoute ensuite le bouton à droite des boutons existants.

par exemple, le fragment de code suivant ajoute un bouton standard à la barre d’outils de Windows Explorer avec l’ID de commande IDB _ MYBUTTON.

TBADDBITMAP tbadbm;
int iButtonIndex;
TBBUTTON tbb;

tbadbm.hInst = g_hInstance;    // The module's instance handle
tbadbm.nID = IDB_BUTTONIMAGE;  // The bitmap's resource ID

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1,
                    reinterpret_cast<LPARAM>(&tbadbm), &iButtonIndex);

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDSTRING, NULL,
                    reinterpret_cast<LPARAM>(szLabel), &iStringIndex);

ZeroMemory(&tbb, sizeof(TBBUTTON));
tbb.iBitmap = iButtonIndex;
tbb.iCommand = IDB_MYBUTTON;
tbb.iString = iStringIndex;
tbb.fsState = TBSTATE_ENABLED;
tbb.fsStyle = TBSTYLE_BUTTON;

psb->SetToolbarItems(&tbb, 1, FCT_MERGE);

Pour plus d’informations sur la gestion des contrôles ToolBar, consultez Toolbar Controls.

modification de la barre d’état de l’explorateur de Windows

vous pouvez utiliser la barre d’état de Windows Explorer pour afficher une variété d’informations utiles. Il existe deux façons d’utiliser la barre d’État :

La première méthode est simple, mais suffisante pour de nombreuses raisons. Pour une plus grande flexibilité, vous pouvez envoyer des messages directement au contrôle de barre d’État en appelant IShellBrowser :: SendControlMsg avec le paramètre ID défini sur FCW _ Status. Pour plus d’informations sur les contrôles de barre d’État, consultez barres d’État.

Stockage des informations spécifiques à la vue

Quand une vue va être détruite, il est souvent utile de stocker des informations telles que l’État ou les paramètres de la vue. Windows L’Explorateur vous invite à effectuer cette tâche en appelant IShellView :: SaveViewState. La méthode recommandée pour enregistrer des informations spécifiques à une vue consiste à appeler IShellBrowser :: GetViewStateStream. Cette méthode vous fournit une interface IStream que vous pouvez utiliser pour stocker les informations. Vous êtes libre d’utiliser n’importe quel format de données approprié.