Skapa förhandsgranskningshanterare
I det här avsnittet beskrivs de specifika gränssnitt och metoder som krävs för att skapa en förhandsgranskningshanterare.
En förhandsgranskningshanterare måste implementera följande gränssnitt:
- IInitializeWithStream::Initiera (rekommenderas starkt), IInitializeWithFileeller IInitializeWithItem
- IObjectWithSite
- IOleWindow
- IPreviewHandler
Om förhandsgranskningshanteraren stöder visuella inställningar som tillhandahålls av värden, till exempel bakgrundsfärg och teckensnitt, måste den även implementera följande gränssnitt:
Det här avsnittet förutsätter att förhandsgranskningshanteraren initieras med en dataström och är registrerad för ett visst filnamnstillägg.
IInitializeWithStream::Initiera
Lagra parametrarna IStream och läge så att du kan läsa objektets data när du är redo att förhandsgranska objektet. Läs inte in datan i Initiera. Ladda data i IPreviewHandler::DoPreview precis innan du renderar.
IObjectWithSite
IObjectWithSite::SetSite
Lagra pekaren IUnknown för senare åtkomst.
Om du för närvarande har en referens till ett IPreviewHandlerFrame- objekt, släpp det. Använd den lagrade IUnknown-pekaren för att anropa QueryInterface- på webbplatsen för en ny IPreviewHandlerFrame- referens.
Om du för närvarande har en acceleratortabell, förstör den. Anropa IPreviewHandlerFrame::GetWindowContext för att hämta en ny acceleratortabell. Lagra den här tabellen. Observera att den endast används som en lista över acceleratornycklar som ramen stöder. Kommandon i acceleratorinmatningar ignoreras.
IObjectWithSite::GetSite
Returnera webbplatsspekaren, vad det än må vara.
IOleWindow
IOleWindow::Kontextkänslig hjälp
Returnera E_NOTIMPL för den här metoden.
IOleWindow::GetWindow
Om förhandsgranskningshanterarens fönster för närvarande finns returnerar du HWND- i det fönstret och S_OK. Om fönstret inte finns returnerar du E_FAIL.
IPreviewHandler
- IPreviewHandler::SetWindow
- IPreviewHandler::SetRect
- IPreviewHandler::DoPreview
- IPreviewHandler::SetFocus
- IPreviewHandler::QueryFocus
- IPreviewHandler::TranslateAccelerator
- IPreviewHandler::Ladda av
IPreviewHandler::SetWindow
Ange parametern hwnd för den här metoden till överordnad för förhandsgranskningshanterarens HWND-. Den här metoden kan anropas flera gånger. Ändra storlek på förhandsversionen så att den endast återges i det område som beskrivs av parametern prc.
Om förhandsgranskningen håller på att återges använder du metoden IPreviewHandler::SetWindow för att ändra den överordnade förhandsgranskningen. Ändra också det område där förhandsgranskningen återges.
IPreviewHandler::SetRect
Ändra storlek på förhandsversionen så att den bara återges i det område som beskrivs i den här metodens prc-.
Om förhandsgranskningen håller på att återges ändrar du det område där förhandsgranskningen återges.
IPreviewHandler::DoPreview
Det är här det verkliga arbetet utförs. Eftersom en förhandsgranskning är dynamisk bör förhandsgranskningsinnehållet bara läsas in när det behövs. Läs inte in innehåll i initieringen.
Om förhandsgranskningshanterarfönstret inte finns skapar du det. Förhandsgranskningshanterarens fönster ska vara underfönster till fönstret som tillhandahålls av IPreviewHandler::SetWindow. De bör vara storleken som tillhandahålls av IPreviewHandler::SetWindow och IPreviewHandler::SetRect (beroende på vilket som kallades senast).
När du har ett fönster läser du in data från IStream- som förhandsgranskningshanteraren initierades med och visar dem i förhandsgranskningshanterarens fönster.
IPreviewHandler::SetFocus
Den här metoden anropas när fokus går in i läsfönstret via en flikåtgärd. Eftersom den kan anges som en framåtriktad flik eller omvänd flik använder du skiftnyckelns aktuella tillstånd för att avgöra om det första eller sista tabbstoppet i läsfönstret ska ha fokus.
IPreviewHandler::QueryFocus
Den här metoden ska anropa funktionen GetFocus och returnera resultatet av anropet i parametern phwnd.
IPreviewHandler::TranslateAccelerator
Den här metoden anropas av meddelandepumpen i förhandsgranskningshanterarens process (oavsett om prevhost.exe eller en anpassad lokal server) som svar på användarens tangenttryckningar. Förhandsgranskningshanterare bör hantera dessa tangenttryckningar eller vidarebefordra dem till sin värd enligt algoritmen som beskrivs nedan.
Men eftersom förhandsgranskningar är skrivskyddade bör tangentbordsinmatning vara minimal och sådana optimeringar behövs inte i många fall.
Om tangentbordsacceleratorn som skickas till den här metoden via meddelandepumpen är en accelerator som din förhandsvisningshanterare accepterar, ska du bearbeta den och returnera S_OK. Om hanteraren inte accepterar den acceleratorn kan acceleratormeddelandet skickas tillbaka ända till ramen som ska hanteras.
Det finns två alternativ för att vidarebefordra tangentbordsacceleratorer tillbaka till ramen:
Den enklaste modellen är att vidarebefordra alla tangenttryckningar till värddatorn med hjälp av IPreviewHandlerFrame::TranslateAccelerator. Detta görs i exemplet för förhandsgranskningshanteraren som medföljer Windows Software Development Kit (SDK). Alla förhandsgranskningshanterare med låg integritet måste använda den här modellen. Om acceleratorn inte hanteras av förhandsgranskningshanteraren anropar du IPreviewHandlerFrame::TranslateAccelerator och returnerar resultatet.
Den andra modellen är att använda en acceleratortabell som en optimering för att undvika att skicka för många tangenttryckningar över processgränserna:
- När IObjectWithSite::SetSite anropas på din förhandsgranskningshanterare, hämtar du acceleratortabellen via IPreviewHandlerFrame::GetWindowContext. (Se till att frigöra handtaget till acceleratortabellen när förhandsgranskningen förstörs.)
- Om acceleratorn hanteras av förhandsgranskningshanteraren, hanterar du den och returnerar S_OK.
- Om acceleratorn inte hanteras av förhandsgranskningshanteraren, jämför du meddelandet med IsAccelerator mot acceleratortabellen som har hämtats.
- Om acceleratorn matchar en post i acceleratortabellen anropar du IPreviewHandlerFrame::TranslateAccelerator och returnerar resultatet.
- Om acceleratorn inte matchar någon post i acceleratortabellen returnerar du S_FALSE.
IPreviewHandler::Unload
När den här metoden anropas ska all återgivning avslutas, alla resurser som allokerats genom att läsa data från dataströmmen ska frigöras, och själva IStream- ska släppas.
När den här metoden anropas måste hanteraren initieras om innan du försöker anropa IPreviewHandler::D oPreview igen.
IPreviewHandlerVisuals
- IPreviewHandlerVisuals::SetBackgroundColor
- IPreviewHandlerVisuals::SetFont
- IPreviewHandlerVisuals::SetTextColor
Dessa metoder bör implementeras när man instruerar förhandsgranskningshanteraren för att anpassa sig till värdens färg- och teckensnittsscheman. Värden begär information från hanteraren för IPreviewHandlerVisuals. Om det visar sig att den stöds ger värden färg, teckensnitt och textfärg.
IPreviewHandlerVisuals::SetBackgroundColor
Lagra den här färgen och använd den under återgivningen när du vill ange en bakgrundsfärg. Om du till exempel vill fylla fönstret när förhandsvisningshanteraren återges till ett område som är mindre än det område som tillhandahålls av IPreviewHandler::SetWindow och IPreviewHandler::SetRect. Observera dock att du inte bör rita utanför det område som tillhandahålls av dessa metoder.
Om den här metoden anropas medan förhandsversionen redan återges bör återgivningen startas om med den här bakgrundsfärgen.
IPreviewHandlerVisuals::SetFont
Lagra den här teckensnittsinformationen och använd den under återgivningen när du vill visa text som är konsekvent med de aktuella Windows Vista-inställningarna.
IPreviewHandlerVisuals::SetTextColor
Lagra den här textfärgsinformationen och använd den under återgivningen när du vill visa text som är konsekvent med de aktuella Windows Vista-inställningarna.
Relaterade ämnen
-
Förhandsgranskningshanterare och Shell-förhandsgranskningsvärd
-
riktlinjer för förhandsversionshanterare