Compartir a través de


Compilar controladores de vista previa

En este tema se describen las interfaces y los métodos específicos necesarios para crear un controlador de vista previa.

Un controlador de vista previa debe implementar las siguientes interfaces:

Si el controlador de vista previa admite la configuración visual proporcionada por el host, como el color de fondo y la fuente, también debe implementar la siguiente interfaz:

En este tema se supone que el controlador de vista previa se inicializa con una secuencia y se registra para una extensión de nombre de archivo determinada.

IInitializeWithStream::Initialize

Almacene los parámetros IStream y mode para que pueda leer los datos del elemento cuando esté listo para obtener una vista previa del elemento. No cargue los datos en Inicializar. Cargue los datos en IPreviewHandler::D oPreview justo antes de representarlos.

IObjectWithSite

IObjectWithSite::SetSite

Almacene el puntero IUnknown para el acceso posterior.

Si actualmente tiene una referencia a un objeto IPreviewHandlerFrame , suéltelo. Use el puntero IUnknown almacenado para llamar a QueryInterface en el sitio para obtener una nueva referencia de IPreviewHandlerFrame .

Si actualmente tiene una tabla de aceleradores, destruyala. Llame a IPreviewHandlerFrame::GetWindowContext para obtener una nueva tabla de aceleradores. Almacene esta tabla. Tenga en cuenta que solo se usa como una lista de teclas de aceleración que admite el marco. Se omiten los comandos de las entradas del acelerador.

IObjectWithSite::GetSite

Devuelve el puntero del sitio, independientemente de lo que sea.

IOleWindow

IOleWindow::ContextSensitiveHelp

Devuelve E_NOTIMPL para este método.

IOleWindow::GetWindow

Si la ventana del controlador de vista previa existe actualmente, devuelva el HWND de esa ventana y S_OK. Si la ventana no existe, devuelva E_FAIL.

IPreviewHandler

IPreviewHandler::SetWindow

Establezca el parámetro hwnd de este método en el elemento primario del HWND del controlador de vista previa. Se puede llamar a este método varias veces. Cambie el tamaño de la vista previa para que solo se represente en el área descrita por el parámetro prc .

Si el previsualizador está en proceso de representación, use el método IPreviewHandler::SetWindow para cambiar el elemento primario del previewer. Cambie también el área en la que se representa el previsualizador.

IPreviewHandler::SetRect

Cambie el tamaño de la vista previa para que solo se represente en el área descrita por el prc de este método.

Si el previsualizador está en proceso de representación, cambie el área en la que se representa el previewer.

IPreviewHandler::D oPreview

Aquí es donde se realiza el trabajo real. Dado que una vista previa es dinámica, el contenido de la versión preliminar solo se debe cargar cuando sea necesario. No cargue contenido en la inicialización.

Si la ventana del controlador de vista previa no existe, créela. Las ventanas del controlador de vista previa deben ser elementos secundarios de la ventana proporcionada por IPreviewHandler::SetWindow. Deben ser el tamaño proporcionado por IPreviewHandler::SetWindow e IPreviewHandler::SetRect (lo que se llamó más recientemente).

Una vez que tenga una ventana, cargue los datos del IStream con el que se inicializó el controlador de vista previa y represente esos datos en la ventana del controlador de vista previa.

IPreviewHandler::SetFocus

Se llama a este método cuando el foco entra en el panel de lectura a través de una acción de tabulación. Puesto que se puede especificar como una pestaña hacia delante o una pestaña inversa, use el estado actual de la tecla MAYÚS para decidir si la primera o la última tabulación del panel de lectura deben recibir el foco.

IPreviewHandler::QueryFocus

Este método debe llamar a la función GetFocus y devolver el resultado de esa llamada en el parámetro phwnd .

IPreviewHandler::TranslateAccelerator

El bombeo de mensajes llama a este método del proceso del controlador de vista previa (ya sea prevhost.exe o un servidor local personalizado) en respuesta a las pulsaciones de teclas del usuario. Los controladores de vista previa deben controlar estas pulsaciones de tecla o reenviarlas al host según el algoritmo que se detalla a continuación.

Sin embargo, dado que las vistas previas son de solo lectura, la entrada del teclado debe ser mínima y las optimizaciones como esta no son necesarias en muchos casos.

Si el acelerador de teclado pasado a este método a través de la bomba de mensajes es un acelerador que acepta el controlador de vista previa, procesarlo y devolver S_OK. Si el controlador no acepta ese acelerador, el mensaje del acelerador se puede devolver en cuanto se controle el marco.

Hay dos opciones para reenviar aceleradores de teclado de nuevo al marco:

El modelo más sencillo es reenviar todas las pulsaciones de teclas al host mediante IPreviewHandlerFrame::TranslateAccelerator. Esto se hace en el ejemplo de controlador de versión preliminar proporcionado con el Kit de desarrollo de software (SDK) de Windows. Todos los controladores de versión preliminar de baja integridad deben usar este modelo. Si el controlador de vista previa no controla el acelerador, llame a IPreviewHandlerFrame::TranslateAccelerator y devuelva su resultado.

El otro modelo consiste en usar una tabla de aceleradores como una optimización para evitar el envío de demasiadas pulsaciones de teclas a través de los límites del proceso:

  1. Cuando se llama a IObjectWithSite::SetSite en el controlador de vista previa, adquiera la tabla de aceleradores a través de IPreviewHandlerFrame::GetWindowContext. (Asegúrese de liberar el identificador de la tabla de aceleradores cuando se destruye el controlador de vista previa).
  2. Si el controlador de vista previa controla el acelerador, controlelo y devuelva S_OK.
  3. Si el controlador de vista previa no controla el acelerador, compare el mensaje mediante IsAccelerator con la tabla de aceleradores adquirida.
  4. Si el acelerador coincide con una entrada de esa tabla de aceleradores, llame a IPreviewHandlerFrame::TranslateAccelerator y devuelva su resultado.
  5. Si el acelerador no coincide con ninguna entrada de la tabla del acelerador, devuelva S_FALSE.

IPreviewHandler::Unload

Cuando se llama a este método, detenga cualquier representación, libere los recursos asignados leyendo los datos de la secuencia y libere el propio IStream .

Una vez que se llama a este método, se debe reinicializar el controlador antes de cualquier intento de llamar de nuevo a IPreviewHandler::D oPreview .

IPreviewHandlerVisuals

Estos métodos deben implementarse al dirigir el controlador de vista previa para responder a las combinaciones de colores y fuentes del host. El host consulta el controlador para IPreviewHandlerVisuals. Si se detecta que se admite, el host lo proporciona con color, fuente y color de texto.

IPreviewHandlerVisuals::SetBackgroundColor

Almacene este color y úselo durante la representación cuando desee proporcionar un color de fondo. Por ejemplo, para rellenar la ventana cuando el controlador se representa en un área menor que la proporcionada por IPreviewHandler::SetWindow e IPreviewHandler::SetRect. Sin embargo, tenga en cuenta que no debe dibujar fuera del área proporcionada por esos métodos.

Si se llama a este método mientras la vista previa ya se está representando, se debe reiniciar la representación con este color de fondo.

IPreviewHandlerVisuals::SetFont

Almacene esta información de fuente y úsela durante la representación cuando desee mostrar texto coherente con la configuración actual de Windows Vista.

IPreviewHandlerVisuals::SetTextColor

Almacena esta información de color de texto y úsela durante la representación cuando quieras mostrar texto coherente con la configuración actual de Windows Vista.

Controladores de vista previa y host de vista previa de Shell

Cómo registrar un controlador de vista previa

Directrices del controlador de versión preliminar