Share via


Génération de gestionnaires en préversion

Cette rubrique décrit les interfaces et méthodes spécifiques requises pour créer un gestionnaire d’aperçu.

Un gestionnaire de préversion doit implémenter les interfaces suivantes :

Si votre gestionnaire d’aperçu prend en charge les paramètres visuels fournis par l’hôte, tels que la couleur d’arrière-plan et la police, il doit également implémenter l’interface suivante :

Cette rubrique suppose que le gestionnaire d’aperçu est initialisé avec un flux et qu’il est inscrit pour une extension de nom de fichier particulière.

IInitializeWithStream::Initialize

Stockez les paramètres IStream et mode afin de pouvoir lire les données de l’élément lorsque vous êtes prêt à afficher un aperçu de l’élément. Ne chargez pas les données dans Initialize. Chargez les données dans IPreviewHandler::D oPreview juste avant le rendu.

IObjectWithSite

IObjectWithSite::SetSite

Stockez le pointeur IUnknown pour un accès ultérieur.

Si vous disposez actuellement d’une référence à un objet IPreviewHandlerFrame , relâchez-le. Utilisez le pointeur IUnknown stocké pour appeler QueryInterface sur le site pour obtenir une nouvelle référence IPreviewHandlerFrame .

Si vous disposez actuellement d’une table d’accélérateurs, détruisez-la. Appelez IPreviewHandlerFrame::GetWindowContext pour obtenir une nouvelle table d’accélérateur. Stockez cette table. Notez qu’il est utilisé uniquement comme liste de touches d’accélérateur que le frame prend en charge. Les commandes dans les entrées de l’accélérateur sont ignorées.

IObjectWithSite::GetSite

Retourne le pointeur de site, quel qu’il soit.

IOleWindow

IOleWindow::ContextSensitiveHelp

Retourne E_NOTIMPL pour cette méthode.

IOleWindow::GetWindow

Si la fenêtre du gestionnaire d’aperçu existe actuellement, retournez le HWND de cette fenêtre et S_OK. Si la fenêtre n’existe pas, retournez E_FAIL.

IPreviewHandler

IPreviewHandler::SetWindow

Définissez le paramètre hwnd de cette méthode sur le parent du HWND de votre gestionnaire d’aperçu. Cette méthode peut être appelée plusieurs fois. Redimensionnez votre aperçu afin qu’il s’affiche uniquement dans la zone décrite par le paramètre prc .

Si l’aperçueur est en cours de rendu, utilisez la méthode IPreviewHandler::SetWindow pour modifier le parent de l’aperçu. Modifiez également la zone dans laquelle l’aperçu est rendu.

IPreviewHandler::SetRect

Redimensionnez votre aperçu afin qu’il ne s’affiche que dans la zone décrite par le prc de cette méthode.

Si l’aperçueur est en cours de rendu, modifiez la zone dans laquelle votre aperçu s’affiche.

IPreviewHandler::D oPreview

C’est là que le vrai travail est fait. Étant donné qu’un aperçu est dynamique, le contenu de l’aperçu ne doit être chargé que lorsqu’il est nécessaire. Ne chargez pas le contenu dans l’initialisation.

Si la fenêtre de gestionnaire d’aperçu n’existe pas, créez-la. Les fenêtres de votre gestionnaire d’aperçu doivent être des enfants de la fenêtre fournie par IPreviewHandler::SetWindow. Il doit s’agir de la taille fournie par IPreviewHandler::SetWindow et IPreviewHandler::SetRect (selon ce qui a été appelé le plus récemment).

Une fois que vous disposez d’une fenêtre, chargez les données à partir de l’IStream avec lequel le gestionnaire d’aperçu a été initialisé et restituez ces données dans la fenêtre de votre gestionnaire d’aperçu.

IPreviewHandler::SetFocus

Cette méthode est appelée lorsque le focus entre dans le volet de lecture par le biais d’une action d’onglet. Étant donné qu’il peut être entré sous la forme d’un onglet avancé ou d’un onglet inverse, utilisez l’état actuel de la touche MAJ pour déterminer si le premier ou le dernier taquet de tabulation dans le volet de lecture doit recevoir le focus.

IPreviewHandler::QueryFocus

Cette méthode doit appeler la fonction GetFocus et retourner le résultat de cet appel dans le paramètre phwnd .

IPreviewHandler::TranslateAccelerator

Cette méthode est appelée par la pompe de messages du processus du gestionnaire d’aperçu (qu’il s’agisse d'prevhost.exe ou d’un serveur local personnalisé) en réponse aux séquences de touches de l’utilisateur. Les gestionnaires d’aperçu doivent gérer ces séquences de touches ou les transférer à leur hôte en fonction de l’algorithme détaillé ci-dessous.

Toutefois, étant donné que les préversions sont en lecture seule, l’entrée au clavier doit être minimale et des optimisations telles que celles-ci ne sont pas nécessaires dans de nombreux cas.

Si l’accélérateur du clavier passé à cette méthode via la pompe de messages est un accélérateur que votre gestionnaire d’aperçu accepte, traitez-le et retournez S_OK. Si votre gestionnaire n’accepte pas cet accélérateur, le message d’accélérateur peut être renvoyé jusqu’à l’image à gérer.

Il existe deux options pour transférer les raccourcis clavier vers le cadre :

Le modèle le plus simple consiste à transférer toutes les séquences de touches à l’hôte à l’aide de IPreviewHandlerFrame::TranslateAccelerator. Cette opération est effectuée dans l’exemple de gestionnaire en préversion fourni avec le Kit de développement logiciel (SDK) Windows. Tous les gestionnaires de préversion à faible intégrité doivent utiliser ce modèle. Si l’accélérateur n’est pas géré par votre gestionnaire d’aperçu, appelez IPreviewHandlerFrame::TranslateAccelerator et retournez son résultat.

L’autre modèle consiste à utiliser une table d’accélérateur comme optimisation pour éviter d’envoyer trop de séquences de touches au-delà des limites du processus :

  1. Lorsque IObjectWithSite::SetSite est appelé sur votre gestionnaire d’aperçu, obtenez la table d’accélérateur via IPreviewHandlerFrame::GetWindowContext. (Veillez à libérer le handle dans la table d’accélérateur lorsque votre aperçu est détruit.)
  2. Si l’accélérateur est géré par votre gestionnaire d’aperçu, gérez-le et retournez S_OK.
  3. Si l’accélérateur n’est pas géré par votre gestionnaire d’aperçu, comparez le message à l’aide de IsAccelerator à la table d’accélérateur acquise.
  4. Si l’accélérateur correspond à une entrée de cette table d’accélérateur, appelez IPreviewHandlerFrame::TranslateAccelerator et retournez son résultat.
  5. Si l’accélérateur ne correspond à aucune entrée de la table d’accélérateurs, retournez S_FALSE.

IPreviewHandler::Unload

Lorsque cette méthode est appelée, arrêtez tout rendu, libérez les ressources allouées en lisant les données du flux et libérez l’IStream lui-même.

Une fois cette méthode appelée, le gestionnaire doit être réinitialisé avant toute tentative d’appel de IPreviewHandler::D oPreview .

IPreviewHandlerVisuals

Ces méthodes doivent être implémentées lorsque le gestionnaire d’aperçu doit répondre aux jeux de couleurs et de polices de l’hôte. L’hôte interroge le gestionnaire pour IPreviewHandlerVisuals. S’il est pris en charge, l’hôte lui fournit la couleur, la police et la couleur du texte.

IPreviewHandlerVisuals::SetBackgroundColor

Stockez cette couleur et utilisez-la lors du rendu lorsque vous souhaitez fournir une couleur d’arrière-plan. Par instance, pour remplir la fenêtre lorsque le gestionnaire s’affiche dans une zone plus petite que la zone fournie par IPreviewHandler::SetWindow et IPreviewHandler::SetRect. Notez, toutefois, que vous ne devez pas dessiner en dehors de la zone fournie par ces méthodes.

Si cette méthode est appelée alors que l’aperçu est déjà affiché, le rendu doit être redémarré à l’aide de cette couleur d’arrière-plan.

IPreviewHandlerVisuals::SetFont

Stockez ces informations de police et utilisez-les pendant le rendu lorsque vous souhaitez afficher du texte cohérent avec les paramètres windows Vista actuels.

IPreviewHandlerVisuals::SetTextColor

Stockez ces informations de couleur de texte et utilisez-les pendant le rendu lorsque vous souhaitez afficher du texte cohérent avec les paramètres Windows Vista actuels.

Gestionnaires d’aperçu et hôte de préversion de l’interpréteur de commandes

Comment inscrire un gestionnaire en préversion

Instructions relatives aux gestionnaires en préversion