Partager via


Implémentation d’un affichage des dossiers

Windows Shell fournit une implémentation par défaut de l’affichage des dossiers, familièrement appelée DefView, afin que vous puissiez éviter une grande partie du travail d’implémentation de votre propre extension d’espace de noms. Étant donné que certaines fonctionnalités d’affichage ne peuvent pas être obtenues via des vues personnalisées, il est souvent recommandé d’utiliser l’objet d’affichage 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’un affichage de dossiers personnalisé qui ne peut pas prendre 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 dossier héberge une fenêtre enfant fournie par l’objet dossier. L’objet folder est responsable de la création d’un objet d’affichage de dossier pour afficher le contenu du dossier dans la fenêtre enfant.

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

En plus de contrôler l’affichage des données, les extensions peuvent également personnaliser un certain nombre de fonctionnalités de Windows Explorer. Par instance, une extension peut ajouter des éléments à la barre d’outils ou à la barre de menus, ou afficher des informations dans la barre d’status.

Objet d’affichage des dossiers

Un objet d’affichage dossier est un objet COM (Component Object Model) qui expose une interface IShellView . Cet objet est responsable des opérations suivantes :

  • Création d’une fenêtre enfant de la fenêtre d’affichage dossier et utilisation de celle-ci pour afficher le contenu du dossier.
  • Gestion de la communication avec Windows Explorer.
  • Ajout de commandes spécifiques au dossier à la barre de menus et à la barre d’outils Windows Explorer et gestion de ces commandes lorsqu’elles sont sélectionnées.
  • Gestion de l’interaction utilisateur avec la fenêtre d’affichage des dossiers, par exemple l’affichage de 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 a lieu dans votre fenêtre enfant, votre objet d’affichage dossier est responsable de sa gestion comme il le ferait pour toute autre fenêtre.

Windows Explorer demande un objet d’affichage de dossier en appelant l’objet IShellFolder::CreateViewObject de votre objet de dossier avec riid défini sur IID_IShellView. La procédure de création d’un affichage de dossiers est la suivante :

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

Initialisation de l’objet d’affichage des dossiers

Windows Explorer initialise l’objet d’affichage de dossiers en appelant la méthode IShellView::CreateViewWindow. Les paramètres de la méthode fournissent à l’objet d’affichage 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 de vue de dossier précédent. Ce paramètre peut être défini sur NULL.
  • Structure FOLDERSETTINGS qui contient les paramètres de l’affichage de dossiers précédent.
  • Pointeur vers l’interface Windows Explorer IShellBrowser.
  • 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 d’affichage 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 principalement utile si le dossier précédent appartenait à votre extension et utilisait le même schéma d’affichage. Si c’est le cas, vous pouvez communiquer avec l’objet d’affichage de dossiers 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 consiste à faire en sorte que tous vos objets d’affichage de dossiers exposent une interface privée. Appelez IShellView::QueryInterface pour demander l’interface privée et examinez la valeur de retour pour déterminer si l’objet d’affichage de 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 de l’affichage des dossiers précédents. Le paramètre principal est le mode d’affichage : grande icône, petite icône, liste ou détails. Il existe é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 votre dossier doit respecter ces paramètres dans la mesure du possible, pour offrir aux utilisateurs une expérience cohérente à mesure qu’ils passent d’un dossier à l’autre. Vous devez stocker cette structure et la mettre à jour à mesure que les paramètres changent. Windows Explorer appelle IShellView::GetCurrentInfo pour obtenir la valeur la plus récente de cette structure avant d’ouvrir la vue de dossier suivante.

L’interface IShellBrowser est exposée par Windows Explorer. Cette interface est un complément à IShellView et permet à un objet d’affichage de dossiers de communiquer avec windows Explorer. Il n’existe pas d’autre moyen de récupérer ce pointeur d’interface. Votre objet d’affichage de dossier doit donc le stocker pour une utilisation ultérieure. En particulier, vous devrez appeler IShellBrowser::GetWindow pour récupérer la fenêtre d’affichage de dossier parent que vous utiliserez 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 d’IOleWindow. Après avoir stocké le pointeur d’interface, n’oubliez pas d’appeler IShellBrowser::AddRef pour incrémenter le nombre 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 de dossiers précédent.
  3. Appelez IShellBrowser::GetWindow pour récupérer la fenêtre d’affichage de dossier parent.
  4. Créez un enfant de la fenêtre d’affichage de dossiers obtenue à l’étape précédente et retournez-le à Windows Explorer.

Affichage de l’affichage dossier

Une fois que vous avez créé la fenêtre enfant et 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 ayant la fenêtre enfant hôte soit un contrôle d’affichage de liste , soit un contrôle WebBrowser. Le contrôle d’affichage de liste vous permet de répliquer l’affichage classique de Windows Explorer. Le contrôle WebBrowser vous permet d’utiliser un document HTML dynamique (DHTML) pour afficher vos informations, à l’instar de la vue Web Windows Explorer. Pour plus d’informations, reportez-vous à la documentation de ces contrôles.

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

  • Activé avec le focus. L’affichage dossier a été créé et a le focus. Définissez la barre de menus ou les éléments de barre d’outils appropriés pour un état prioritaire.
  • Activé sans focus. La vue dossier a été créée et est active, mais elle n’a pas de focus. Définissez la barre de menus ou les éléments de barre d’outils appropriés pour un état non centré. Omettez tous les éléments qui s’appliquent à la sélection d’éléments dans l’affichage dossier.
  • Désactivé. La vue dossier est sur le point d’être détruite. Supprimez tous les éléments de menu spécifiques au dossier.

Windows Explorer avertit votre objet d’affichage de dossiers lorsque l’état de la fenêtre change en appelant IShellView::UIActivate. À son tour, l’objet d’affichage dossier doit avertir Windows Explorer lorsqu’un utilisateur active la fenêtre d’affichage de dossiers en appelant IShellBrowser::OnViewWindowActive. Pour plus d’informations sur cette interface, consultez Utilisation d’IShellBrowser pour communiquer avec Windows Explorer.

Pendant que l’affichage dossier est actif, vous devez traiter tous les messages Windows, tels que WM_SIZE, qui appartiennent à votre fenêtre enfant. Votre procédure de fenêtre reçoit également WM_COMMAND messages pour tous les éléments que vous avez ajoutés à la barre de menus ou à la barre d’outils Windows Explorer.

Après avoir créé l’affichage dossier, Windows Explorer appelle l’interface IShellView de l’objet d’affichage dossier pour lui transmettre diverses informations. Votre objet doit modifier son affichage en conséquence. Lorsque l’affichage des dossiers est sur le point d’être détruit, Windows Explorer avertit l’objet d’affichage de dossiers en appelant sa méthode IShellView::D estroyViewWindow.

Implémentation d’IShellView

Une fois l’objet de 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 explique 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 le fichier commun. Pour plus d’informations, consultez la documentation IShellView .

AddPropertySheetPages

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

Windows Explorer transmet 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 conserver une vue de dossier similaire. Par instance, si l’affichage de dossiers précédent affichait de grandes icônes, le suivant devrait également. Lorsque Windows Explorer appelle IShellView::CreateViewWindow pour initialiser votre objet d’affichage de dossiers, la méthode reçoit une structure FOLDERSETTINGS. Cette structure contient des informations qui vous permettent de rendre l’affichage de votre affichage de dossiers cohérent avec l’affichage des dossiers précédent.

Pour vous assurer que la vue suivante est cohérente avec l’affichage actuel, stockez la structure FOLDERSETTINGS . Si la vue change, pour instance de grandes à petites icônes, mettez à jour la structure en conséquence. Avant de changer d’affichage, windows Explorer appelle IShellView::GetCurrentInfo pour demander les valeurs FOLDERSETTINGS actuelles pour les transmettre à l’objet d’affichage de dossiers 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 d’affichage dossier doit immédiatement mettre à jour l’affichage de l’affichage des dossiers.

Saveviewstate

Windows Explorer appelle la méthode IShellView::SaveViewState pour inviter votre objet d’affichage de dossiers à enregistrer son état d’affichage. Vous pouvez ensuite récupérer l’état lors de la prochaine affichage du dossier. La méthode recommandée pour enregistrer un état d’affichage consiste à appeler la méthode IShellBrowser::GetViewStateStream . Cette méthode retourne une interface IStream que votre objet d’affichage de dossiers peut utiliser pour enregistrer son état. Lorsque vous créez une autre vue de dossier, 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 de dossiers précédents.

TranslateAcelerator

Lorsque l’utilisateur appuie sur une touche de raccourci, Windows Explorer transmet le message à l’objet d’affichage de dossiers en appelant IShellView::TranslateAccelerator. Retournez S_FALSE pour que Windows Explorer traite le message. Si votre objet d’affichage dossier a traité le message, retournez S_OK.

Lorsque la fenêtre d’affichage dossier 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 aux commandes de barre de menus ou de barre d’outils Windows Explorer, votre objet d’affichage de dossier doit normalement retourner S_FALSE. Les Explorer Windows peuvent ensuite traiter le message normalement. Retournez S_OK uniquement si le message est spécifique au 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 d’abord le message. Il appelle IShellBrowser::TranslateAcceleratorSB uniquement s’il ne gère pas le message.

Utilisation d’IShellBrowser pour communiquer avec Windows Explorer

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

Modification de la barre de menus windows Explorer

La barre de menus windows Explorer permet à l’utilisateur de lancer diverses commandes. Par défaut, la barre de menus prend uniquement en charge les commandes spécifiques à Windows Explorer. Les messages WM_COMMAND associés sont traités par Windows Explorer et ne sont pas transmis à votre objet d’affichage de dossiers. Toutefois, vous pouvez modifier la barre de menus pour inclure un ou plusieurs éléments de menu spécifiques à un dossier avec IShellBrowser. Windows Explorer transmet les messages WM_COMMAND associés de ces éléments à la procédure de fenêtre de l’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 dossier modifient généralement la barre de menus avant que l’affichage des dossiers ne soit affiché pour la première fois. Ils doivent retourner l’état d’origine de la barre de menus lorsque l’affichage des dossiers est détruit. Vous devrez peut-être également modifier la barre de menus chaque fois que votre affichage de dossier gagne ou perd le focus.

Étant donné que 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 windows Explorer 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 Explorer renseignera 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 Explorer dispose de six menus contextuels dans sa barre de menus. Comme pour tous les conteneurs OLE, le menu Windows Explorer est divisé en six groupes : Fichier, Modifier, Conteneur, Objet, Fenêtre et Aide. Le tableau suivant répertorie les menus contextuels Windows Explorer et leur groupe associé, ainsi que les ID de menu.

Menu contextuel id Groupe
Fichier FCIDM_MENU_FILE Fichier
Modifier FCIDM_MENU_EDIT Fichier
Affichage FCIDM_MENU_VIEW Conteneur
Favoris FCIDM_MENU_FAVORITES Conteneur
Outils FCIDM_MENU_TOOLS Conteneur
Aide FCIDM_MENU_HELP Fenêtre

 

Lorsque vous passez le handle 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.

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

  • Ajoutez des éléments aux menus contextuels Windows Explorer.
  • Modifiez ou supprimez des éléments existants dans les menus contextuels Windows Explorer.
  • Ajouter de nouveaux menus contextuels.

Utilisez les ID répertoriés dans le tableau pour identifier les différents menus contextuels windows Explorer.

Notes

Pour éviter les conflits avec les ID de commande Windows Explorer, les ID de tous les é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 terminé de modifier le menu, appelez IShellBrowser::SetMenuSB pour que Windows Explorer afficher la nouvelle barre de menus.

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

Lorsque 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 Windows Explorer

En plus de modifier la barre de menus Windows Explorer, 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 IShellView::UIActivate . La procédure d’ajout de boutons à la barre d’outils Windows Explorer est la suivante :

  1. Ajoutez la 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 bitmap à la liste d’images d’une barre d’outils, envoyez à la barre d’outils un message TB_ADDBITMAP en appelant IShellBrowser::SendControlMsg. Pour spécifier le contrôle de barre d’outils, définissez le paramètre id de la méthode sur FCW_TOOLBAR. Définissez wParam sur le nombre d’images de bouton dans la 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 :

  • Affectez la chaîne au membre iString de la structure TBBUTTON du bouton.
  • Appelez IShellBrowser::SendControlMsg pour envoyer au contrôle de barre d’outils un message TB_ADDSTRING . 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, renseignez une structure TBBUTTON et passez-la à IShellBrowser::SetToolbarItems. Comme dans le menu, votre ID de commande doit être compris entre FCIDM_SHVIEWFIRST et FCIDM_SHVIEWLAST. La barre d’outils ajoute ensuite le bouton à droite des boutons existants.

Par instance, le fragment de code suivant ajoute un bouton standard à la barre d’outils 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 de barre d’outils, consultez Contrôles de barre d’outils.

Modification de la barre d’état windows Explorer

Vous pouvez utiliser la barre d’Explorer status Windows pour afficher diverses informations utiles. Il existe deux façons d’utiliser la barre de status :

La première méthode est simple, mais suffisante à de nombreuses fins. Pour plus de flexibilité, vous pouvez envoyer des messages directement au contrôle de barre d’status en appelant IShellBrowser::SendControlMsg avec le paramètre id défini sur FCW_STATUS. Pour plus d’informations sur les contrôles de barre de status, consultez Barres d’état.

Stockage d’informations spécifiques à l’affichage

Lorsqu’une vue est sur le point d’être détruite, il est souvent utile de stocker des informations telles que l’état ou les paramètres de la vue. Windows Explorer vous invite à effectuer cette tâche en appelant IShellView::SaveViewState. La meilleure façon d’enregistrer des informations spécifiques à l’affichage 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é.