Erstellen von Vorschauhandlern
In diesem Thema werden die spezifischen Schnittstellen und Methoden erläutert, die zum Erstellen eines Vorschauhandlers erforderlich sind.
Ein Vorschauhandler muss die folgenden Schnittstellen implementieren:
- IInitializeWithStream::Initialize (stark bevorzugt), IInitializeWithFileoder IInitializeWithItem
- Iobjectwithsite
- IOleWindow
- IPreviewHandler
Wenn Ihr Vorschauhandler vom Host bereitgestellte visuelle Einstellungen wie Hintergrundfarbe und Schriftart unterstützt, muss er auch die folgende Schnittstelle implementieren:
In diesem Thema wird davon ausgegangen, dass der Vorschauhandler mit einem Stream initialisiert und für eine bestimmte Dateierweiterung registriert ist.
IInitializeWithStream::Initialize
Store IStream- und Mode-Parameter, damit Sie die Daten des Elements lesen können, wenn Sie bereit sind, eine Vorschau des Elements anzuzeigen. Laden Sie die Daten nicht in Initialize. Laden Sie die Daten direkt vor dem Rendern in IPreviewHandler::D oPreview.
Iobjectwithsite
IObjectWithSite::SetSite
Store IUnknown-Zeiger für den späteren Zugriff.
Wenn Sie derzeit über einen Verweis auf ein IPreviewHandlerFrame-Objekt verfügen, geben Sie es frei. Verwenden Sie den gespeicherten IUnknown-Zeiger zum Aufrufen von QueryInterface auf der Website für einen neuen IPreviewHandlerFrame-Verweis.
Wenn Sie derzeit über eine Zugriffstastentabelle verfügen, zerstören Sie sie. Rufen Sie IPreviewHandlerFrame::GetWindowContext auf, um eine neue Zugriffstastentabelle zu erhalten. Store tabelle. Beachten Sie, dass es nur als Liste von Zugriffstasten verwendet wird, die der Frame unterstützt. Befehle in den Zugriffstasteneinträgen werden ignoriert.
IObjectWithSite::GetSite
Gibt den Standortzeiger zurück, unabhängig davon, was er ist.
IOleWindow
IOleWindow::ContextSensitiveHelp
Gibt E _ NOTIMPL für diese Methode zurück.
IOleWindow::GetWindow
Wenn das Fenster des Vorschauhandlers derzeit vorhanden ist, geben Sie den HWND dieses Fensters und S _ OK zurück. Wenn das Fenster nicht vorhanden ist, geben Sie E _ FAIL zurück.
IPreviewHandler
- IPreviewHandler::SetWindow
- IPreviewHandler::SetRect
- IPreviewHandler::D oPreview
- IPreviewHandler::SetFocus
- IPreviewHandler::QueryFocus
- IPreviewHandler::TranslateAccelerator
- IPreviewHandler::Unload
IPreviewHandler::SetWindow
Legen Sie den hwnd-Parameter dieser Methode auf das übergeordnete Element des HWND-Elements Ihres Vorschauhandlers fest. Diese Methode kann mehrmals aufgerufen werden. Ändern Sie die Größe Ihrer Vorschau, sodass sie nur in dem bereich gerendert wird, der durch den prc-Parameter beschrieben wird.
Wenn die Vorschauversion gerendert wird, verwenden Sie die IPreviewHandler::SetWindow-Methode, um das übergeordnete Element der Vorschau zu ändern. Ändern Sie auch den Bereich, in dem die Vorschau gerendert wird.
IPreviewHandler::SetRect
Ändern Sie die Größe Ihrer Vorschau, sodass sie nur in dem Bereich gerendert wird, der vom PRC dieser Methode beschrieben wird.
Wenn sich die Vorschauversion im Rendering befindet, ändern Sie den Bereich, in dem die Vorschau gerendert wird.
IPreviewHandler::D oPreview
Hier wird die eigentliche Arbeit erledigt. Da eine Vorschau dynamisch ist, sollte der Vorschauinhalt nur geladen werden, wenn er benötigt wird. Laden Sie keinen Inhalt in der Initialisierung.
Wenn das Vorschauhandlerfenster nicht vorhanden ist, erstellen Sie es. Die Fenster des Vorschauhandlers sollten unter dem von IPreviewHandler::SetWindowbereitgestellten Fenster sein. Sie sollten die Größe haben, die von IPreviewHandler::SetWindow und IPreviewHandler::SetRect bereitgestellt wird (was zuletzt aufgerufen wurde).
Sobald Sie über ein Fenster verfügen, laden Sie die Daten aus dem IStream, mit dem der Vorschauhandler initialisiert wurde, und rendern Sie diese Daten im Fenster Ihres Vorschauhandlers.
IPreviewHandler::SetFocus
Diese Methode wird aufgerufen, wenn der Fokus über eine Registerkartenaktion in den Lesebereich eintritt. Da sie als Vorwärtsregisterkarte oder umgekehrte Registerkarte eingegeben werden kann, verwenden Sie den aktuellen Status der UMSCHALTTASTE, um zu entscheiden, ob die erste oder letzte Registerkartenstopp im Lesebereich den Fokus erhalten soll.
IPreviewHandler::QueryFocus
Diese Methode sollte die GetFocus-Funktion aufrufen und das Ergebnis dieses Aufrufs im phwnd-Parameter zurückgeben.
IPreviewHandler::TranslateAccelerator
Diese Methode wird vom Nachrichtenpump des Prozesses des Vorschauhandlers (unabhängig davon, ob prevhost.exe oder ein benutzerdefinierter lokaler Server) als Reaktion auf Benutzertasteneingaben aufgerufen. Vorschauhandler sollten diese Tastatureingaben verarbeiten oder gemäß dem unten beschriebenen Algorithmus an ihren Host weitersennen.
Da Vorschauversionen jedoch schreibgeschützt sind, sollte die Tastatureingabe minimal sein, und Optimierungen wie diese sind in vielen Fällen nicht erforderlich.
Wenn es sich bei der tastenbeschleunigung, die über die Meldungspumpe an diese Methode übergeben wird, um eine Zugriffstaste handelt, die ihr Vorschauhandler akzeptiert, verarbeiten Sie sie, und geben Sie S _ OK zurück. Wenn ihr Handler diese Zugriffstaste nicht akzeptiert, kann die Zugriffstastennachricht bis zum zu behandelnden Frame zurück gesendet werden.
Es gibt zwei Optionen zum Weiterleiten von Tastenkombinationen zurück an den Frame:
Das einfachste Modell besteht in der Weitergeleitet aller Tastaturanschläge an den Host mithilfe von IPreviewHandlerFrame::TranslateAccelerator. Dies erfolgt im Vorschauhandlerbeispiel, das mit dem Windows Software Development Kit (SDK) bereitgestellt wird. Alle Vorschauhandler mit niedriger Integrität müssen dieses Modell verwenden. Wenn die Zugriffstaste nicht von Ihrem Vorschauhandler behandelt wird, rufen Sie IPreviewHandlerFrame::TranslateAccelerator auf, und geben Sie das Ergebnis zurück.
Das andere Modell besteht in der Verwendung einer Zugriffstastentabelle als Optimierung, um zu viele Tastatureingaben über Prozessgrenzen hinweg zu vermeiden:
- Wenn IObjectWithSite::SetSite für Ihren Vorschauhandler aufgerufen wird, erhalten Sie die Zugriffstastentabelle über IPreviewHandlerFrame::GetWindowContext. (Achten Sie darauf, das Handle für die Zugriffstastentabelle frei zu geben, wenn Ihr Vorschauversionsfenster zerstört wird.)
- Wenn die Zugriffstaste von Ihrem Vorschauhandler verarbeitet wird, behandeln Sie sie, und geben Sie S _ OK zurück.
- Wenn die Zugriffstaste nicht von Ihrem Vorschauhandler behandelt wird, vergleichen Sie die Nachricht mit IsAccelerator mit der erhaltenen Zugriffstastentabelle.
- Wenn die Zugriffstaste einem Eintrag in dieser Zugriffstastentabelle entspricht, rufen Sie IPreviewHandlerFrame::TranslateAccelerator auf, und geben Sie das Ergebnis zurück.
- Wenn die Zugriffstaste nicht mit einem Eintrag in der Zugriffstastentabelle übereinstimmen soll, geben Sie S _ FALSE zurück.
IPreviewHandler::Unload
Wenn diese Methode aufgerufen wird, beenden Sie jedes Rendering, geben Sie alle Ressourcen frei, die durch Lesen von Daten aus dem Stream zugeordnet sind, und geben Sie den IStream selbst frei.
Nachdem diese Methode aufgerufen wurde, muss der Handler erneut initialisiert werden, bevor versucht wird, IPreviewHandler::D oPreview erneut aufrufen.
IPreviewHandlerVisuals
- IPreviewHandlerVisuals::SetBackgroundColor
- IPreviewHandlerVisuals::SetFont
- IPreviewHandlerVisuals::SetTextColor
Diese Methoden sollten implementiert werden, wenn sie den Vorschauhandler anweisen, auf die Farb- und Schriftartschemas des Hosts zu reagieren. Der Host fragt den Handler für IPreviewHandlerVisuals ab. Wenn der Host unterstützt wird, stellt er Farbe, Schriftart und Textfarbe zur Anwendung.
IPreviewHandlerVisuals::SetBackgroundColor
Store diese Farbe, und verwenden Sie sie während des Renderings, wenn Sie eine Hintergrundfarbe bereitstellen möchten. So füllen Sie beispielsweise das Fenster aus, wenn der Handler in einem Bereich gerendert wird, der kleiner als der von IPreviewHandler::SetWindow und IPreviewHandler::SetRectbereitgestellte Bereich ist. Beachten Sie jedoch, dass Sie nicht außerhalb des von diesen Methoden bereitgestellten Bereichs zeichnen sollten.
Wenn diese Methode aufgerufen wird, während die Vorschauversion bereits gerendert wird, sollte das Rendering mit dieser Hintergrundfarbe neu gestartet werden.
IPreviewHandlerVisuals::SetFont
Store diese Schriftartinformationen, und verwenden Sie sie während des Renderings, wenn Sie Text anzeigen möchten, der mit den aktuellen Windows Vista-Einstellungen konsistent ist.
IPreviewHandlerVisuals::SetTextColor
Store diese Textfarbinformationen, und verwenden Sie sie beim Rendern, wenn Sie Text konsistent mit den aktuellen Windows Vista-Einstellungen anzeigen möchten.