Creazione di gestori di anteprima
Questo argomento illustra le interfacce e i metodi specifici necessari per creare un gestore di anteprima.
Un gestore di anteprima deve implementare le interfacce seguenti:
- IInitializeWithStream::Initialize (fortemente preferito), IInitializeWithFileo IInitializeWithItem
- IObjectWithSite
- IOleWindow
- IPreviewHandler
Se il gestore di anteprima supporta le impostazioni visive fornite dall'host, ad esempio il colore di sfondo e il tipo di carattere, deve implementare anche l'interfaccia seguente:
In questo argomento si presuppone che il gestore di anteprima sia stato inizializzato con un flusso e sia associato a una specifica estensione di nome file.
IInitializeWithStream::Initialize
Archiviare i parametri IStream e modalità in modo da poter leggere i dati dell'elemento quando si è pronti per visualizzare in anteprima l'elemento. Non caricare i dati in . Inizializzare. Carica i dati in IPreviewHandler::DoPreview prima di eseguire il rendering.
IObjectWithSite
IObjectWithSite::SetSite
Archiviare il puntatore IUnknown per un accesso successivo.
Se è attualmente disponibile un riferimento a un oggetto IPreviewHandlerFrame, rilasciarlo. Usa il puntatore archiviato IUnknown per chiamare QueryInterface sul sito per ottenere un nuovo riferimento IPreviewHandlerFrame.
Se al momento hai una tabella degli acceleratori, distruggila. Chiamare IPreviewHandlerFrame::GetWindowContext per ottenere una nuova tabella degli acceleratori. Archiviare la tabella. Si noti che viene usato solo come elenco di tasti di scelta rapida supportati dal frame. I comandi nelle voci di acceleratore vengono ignorati.
IObjectWithSite::GetSite
Restituisce il puntatore del sito, qualunque esso sia.
IOleWindow
IOleWindow::ContextSensitiveHelp
Restituire E_NOTIMPL per questo metodo.
IOleWindow::GetWindow
Se la finestra del gestore di anteprima esiste attualmente, restituire il HWND di tale finestra e S_OK. Se la finestra non esiste, restituire E_FAIL.
IPreviewHandler
- IPreviewHandler::SetWindow
- IPreviewHandler::SetRect
- IPreviewHandler::DoPreview
- IPreviewHandler::SetFocus
- IPreviewHandler::QueryFocus
- IPreviewHandler::TranslateAccelerator
- IPreviewHandler::Unload
IPreviewHandler::SetWindow
Impostare il parametro hwnd di questo metodo sull'elemento padre del gestore di anteprima HWND. Questo metodo può essere chiamato più volte. Ridimensionare l'anteprima in modo che venga eseguito il rendering solo nell'area descritta dal parametro prc.
Se il visualizzatore di anteprima è in fase di rendering, usare il metodo IPreviewHandler::SetWindow per modificare l'elemento padre del visualizzatore di anteprima. Modificare anche l'area in cui viene eseguito il rendering dell'anteprima.
IPreviewHandler::SetRect
Ridimensionare l'anteprima in modo che venga eseguito il rendering solo nell'area descritta dal prc di questo metodo.
Se l'anteprima è in fase di rendering, modificare l'area in cui viene eseguito il rendering dell'anteprima.
IPreviewHandler::DoPreview
È qui che viene fatto il vero lavoro. Poiché un'anteprima è dinamica, il contenuto dell'anteprima deve essere caricato solo quando è necessario. Non caricare il contenuto nell'inizializzazione.
Se la finestra del gestore di anteprima non esiste, crearla. Le finestre del gestore di anteprima devono essere figlie della finestra fornita da IPreviewHandler::SetWindow. Devono avere le dimensioni fornite da IPreviewHandler::SetWindow e IPreviewHandler::SetRect (a seconda di quale sia stato chiamato più di recente).
Dopo aver creato una finestra, caricare i dati dalla IStream con cui è stato inizializzato il gestore di anteprima ed eseguire il rendering dei dati nella finestra del gestore di anteprima.
IPreviewHandler::SetFocus
Questo metodo viene chiamato quando lo stato attivo entra nel riquadro di lettura tramite un'azione di tabulazione. Dal momento che può essere impostato come tabulatore avanti o indietro, utilizza lo stato attuale del tasto MAIUSC per decidere se il primo o l'ultimo punto di tabulazione nell'area di lettura dovrebbe ricevere il fuoco.
IPreviewHandler::QueryFocus
Questo metodo deve chiamare la funzione GetFocus e restituire il risultato di tale chiamata nel parametro phwnd.
IPreviewHandler::TranslateAccelerator
Questo metodo viene chiamato dal message pump del processo del gestore di anteprima (prevhost.exe o da un server locale personalizzato) in risposta alle sequenze di tasti utente. I gestori di anteprima devono gestire queste sequenze di tasti o inoltrarle all'host in base all'algoritmo descritto di seguito.
Tuttavia, poiché le anteprime sono di sola lettura, l'input della tastiera deve essere minimo e ottimizzazioni come questa non sono necessarie in molti casi.
Se l'acceleratore di tastiera passato a questo metodo attraverso il message pump è un acceleratore accettato dal gestore di anteprima, elaboralo e restituisci S_OK. Se il gestore non accetta quell'acceleratore, il messaggio dell'acceleratore può essere inviato al frame affinché venga gestito.
Sono disponibili due opzioni per inoltrare i tasti di scelta rapida alla finestra.
Il modello più semplice consiste nell'inoltrare tutte le sequenze di tasti all'host usando IPreviewHandlerFrame::TranslateAccelerator. Questa operazione viene eseguita nell'esempio del gestore di anteprima fornito con Windows Software Development Kit (SDK). Tutti i handler di anteprima a bassa integrità devono usare questo modello. Se l'acceleratore non è gestito dall'handler di anteprima, invocare IPreviewHandlerFrame::TranslateAccelerator e restituirne il risultato.
L'altro modello consiste nell'usare una tabella degli acceleratori come ottimizzazione per evitare l'invio di troppe sequenze di tasti attraverso i confini dei processi.
- Quando IObjectWithSite::SetSite viene chiamato nel gestore di anteprima, acquisire la tabella dell'acceleratore tramite IPreviewHandlerFrame::GetWindowContext. Assicurarsi di liberare l'handle per la tabella dell'acceleratore quando il visualizzatore di anteprima viene eliminato definitivamente.
- Se l'acceleratore viene gestito dal gestore di anteprima, gestiscilo e restituisci S_OK.
- Se l'acceleratore non viene gestito dal gestore di anteprima, confrontare il messaggio usando IsAccelerator rispetto alla tabella di tasti di scelta rapida acquisita.
- Se l'acceleratore corrisponde a una voce nella tabella dell'acceleratore, chiamare IPreviewHandlerFrame::TranslateAccelerator e restituirne il risultato.
- Se l'acceleratore non corrisponde ad alcuna voce nella tabella dell'acceleratore, restituire S_FALSE.
IPreviewHandler::Unload
Quando questo metodo viene chiamato, arrestare qualsiasi rendering, rilasciare le risorse allocate leggendo i dati dal flusso e rilasciare il IStream stesso.
Dopo aver chiamato questo metodo, è necessario reinizializzare il gestore prima di qualsiasi tentativo di chiamare IPreviewHandler::D oPreview di nuovo.
IPreviewHandlerVisuals
- IPreviewHandlerVisuals::SetBackgroundColor
- IPreviewHandlerVisuals::SetFont
- IPreviewHandlerVisuals::SetTextColor
Questi metodi devono essere implementati quando si indirizza il gestore di anteprima a rispondere alle combinazioni di colori e tipi di carattere dell'host. L'host interroga il gestore per IPreviewHandlerVisuals. Se trovato come supportato, l'host lo fornisce con colore, tipo di carattere e colore del testo.
IPreviewHandlerVisuals::SetBackgroundColor
Archiviare questo colore e usarlo durante il rendering quando si desidera specificare un colore di sfondo. Ad esempio, per riempire la finestra quando il gestore esegue il rendering in un'area più piccola rispetto all'area fornita da IPreviewHandler::SetWindow e IPreviewHandler::SetRect. Si noti, tuttavia, che non è consigliabile disegnare all'esterno dell'area fornita da tali metodi.
Se questo metodo viene chiamato mentre è già in corso il rendering dell'anteprima, il rendering deve essere riavviato usando questo colore di sfondo.
IPreviewHandlerVisuals::SetFont
Archiviare queste informazioni sul tipo di carattere e usarle durante il rendering quando si desidera visualizzare testo coerente con le impostazioni correnti di Windows Vista.
IPreviewHandlerVisuals::SetTextColor
Archiviare queste informazioni sul colore del testo e usarle durante il rendering quando si desidera visualizzare testo coerente con le impostazioni correnti di Windows Vista.
Argomenti correlati