Partilhar via


Criando Manipuladores de Pré-Visualização

Este tópico discute as interfaces e métodos específicos necessários para criar um manipulador de visualização.

Um manipulador de visualização deve implementar as seguintes interfaces:

Se o manipulador de visualização oferecer suporte a configurações visuais fornecidas pelo host, como cor de plano de fundo e fonte, ele também deverá implementar a seguinte interface:

  • IPreviewHandlerVisuals

Este tópico pressupõe que o manipulador de visualização seja inicializado com um fluxo e esteja registrado para uma extensão de nome de arquivo específica.

IInitializeWithStream::Inicializar

Armazena o IStream e os parâmetros de modo para que possas ler os dados do item quando estiveres pronto para visualizar o item. Não carregue os dados em inicializar. Carregue os dados no IPreviewHandler::D oPreview imediatamente antes de renderizar.

IObjectWithSite

IObjectWithSite::SetSite

Armazene o ponteiro IUnknown para acesso posterior.

Se atualmente tiver uma referência a um objeto IPreviewHandlerFrame, liberte-a. Use o ponteiro armazenado IUnknown para chamar QueryInterface no site para uma nova referência de IPreviewHandlerFrame.

Se você tem atualmente uma mesa de aceleração, destrua-a. Chame IPreviewHandlerFrame::GetWindowContext para obter uma nova tabela de aceleradores. Armazene esta tabela. Observe que ele é usado apenas como uma lista de teclas de aceleração que o quadro suporta. Os comandos nas entradas do acelerador são ignorados.

IObjectWithSite::GetSite

Devolva o ponteiro do site, seja ele qual for.

IOleWindow

IOleWindow::AjudaSensívelAoContexto

Retorne E_NOTIMPL para este método.

IOleWindow::GetWindow

Se a janela do manipulador de visualização existir atualmente, retorne o HWND dessa janela e S_OK. Se a janela não existir, retorne E_FAIL.

IPreviewHandler

IPreviewHandler::SetWindow

Defina o parâmetro hwnd deste método como o pai do HWND do seu manipulador de pré-visualização. Este método pode ser chamado várias vezes. Redimensione sua visualização para que ela seja renderizada somente na área descrita pelo parâmetro prc.

Se o pré-visualizador estiver no processo de renderização, use o método IPreviewHandler::SetWindow para alterar o pai do pré-visualizador. Altere também a área na qual o pré-visualizador está renderizando.

IPreviewHandler::SetRect

Redimensione sua visualização para que ela seja renderizada apenas na área descrita pelo prcdeste método.

Se o pré-visualizador estiver no processo de renderização, altere a área na qual o pré-visualizador renderiza.

IPreviewHandler::DoPreview

É aqui que o verdadeiro trabalho é feito. Como uma visualização é dinâmica, o conteúdo da visualização só deve ser carregado quando necessário. Não carregue conteúdo na inicialização.

Se a janela do manipulador de visualização não existir, crie-a. As janelas do manipulador de visualização devem ser filhas da janela fornecida por IPreviewHandler::SetWindow. Eles devem ter o tamanho fornecido por IPreviewHandler::SetWindow e IPreviewHandler::SetRect (o que foi chamado mais recentemente).

Depois de ter uma janela, carregue os dados do IStream com o qual o manipulador de visualização foi inicializado e renderize esses dados na janela do manipulador de visualização.

IPreviewHandler::SetFocus

Esse método é chamado quando o foco entra no painel de leitura por meio de uma ação de tabulação. Como a tabulação pode ser feita tanto para a frente como para trás, use o estado atual da tecla SHIFT para decidir se a primeira ou a última tabulação no painel de leitura deve ter o foco.

IPreviewHandler::QueryFocus

Esse método deve chamar a funçãoGetFocus e retornar o resultado dessa chamada no parâmetro phwnd.

IPreviewHandler::TranslateAccelerator

Esse método é chamado pela bomba de mensagens do processo do manipulador de visualização, seja prevhost.exe, ou um servidor local personalizado, em resposta às teclas pressionadas pelo usuário. Os manipuladores de visualização devem lidar com essas teclas pressionadas ou encaminhá-las para seu host de acordo com o algoritmo detalhado abaixo.

No entanto, como as visualizações são somente leitura, a entrada do teclado deve ser mínima e otimizações como essa não são necessárias em muitos casos.

Se o acelerador de teclado passado para este método através da bomba de mensagens for um acelerador que o manipulador de visualização aceita, processe-o e retorne S_OK. Se o manipulador não aceitar esse acelerador, a mensagem do acelerador poderá ser enviada de volta até o quadro a ser manipulado.

Há duas opções para encaminhar aceleradores de teclado de volta para o quadro:

O modelo mais simples é encaminhar todas as teclas pressionadas para o host usando IPreviewHandlerFrame::TranslateAccelerator. Isso é feito no exemplo de manipulador de visualização fornecido com o Windows Software Development Kit (SDK). Todos os manipuladores de visualização de baixa integridade devem usar esse modelo. Se o acelerador não for manipulado pelo manipulador de visualização, chame IPreviewHandlerFrame::TranslateAccelerator e retorne o seu resultado.

O outro modelo é usar uma tabela aceleradora como uma otimização para evitar o envio de muitos toques de teclas através dos limites do processo.

  1. Quando IObjectWithSite::SetSite for chamado em seu manipulador de visualização, adquira a tabela aceleradora por meio IPreviewHandlerFrame::GetWindowContext. (Certifique-se de liberar a alça para a tabela do acelerador quando o pré-visualizador for destruído.)
  2. Se o acelerador for manipulado pelo manipulador de visualização, manipule-o e retorne S_OK.
  3. Se o acelerador não for manipulado pelo manipulador de visualização, compare a mensagem usando IsAccelerator com a tabela de aceleração adquirida.
  4. Se o acelerador corresponder a uma entrada nessa tabela de aceleradores, chame IPreviewHandlerFrame::TranslateAccelerator e retorne o resultado.
  5. Se o acelerador não corresponder a nenhuma entrada na tabela do acelerador, retorne S_FALSE.

IPreviewHandler::Descarregar

Quando esse método é chamado, pare qualquer renderização, libere todos os recursos alocados lendo dados do fluxo e libere o IStream em si.

Depois que esse método é chamado, o manipulador deve ser reinicializado antes de qualquer tentativa de chamar IPreviewHandler::D oPreview novamente.

IPreviewHandlerVisuals

Esses métodos devem ser implementados ao direcionar o manipulador de visualização para responder aos esquemas de cores e fontes do host. O host consulta o manipulador para IPreviewHandlerVisuals. Se for suportado, o host aplica cor, tipo de letra e cor de texto.

IPreviewHandlerVisuals::SetBackgroundColor

Armazene essa cor e use-a durante a renderização quando quiser fornecer uma cor de plano de fundo. Por exemplo, para preencher a janela quando o manipulador renderiza para uma área menor do que a área fornecida pelo IPreviewHandler::SetWindow e IPreviewHandler::SetRect. Note, no entanto, que você não deve desenhar fora da área fornecida por esses métodos.

Se esse método for chamado enquanto a visualização já está sendo renderizada, a renderização deve ser reiniciada usando essa cor de plano de fundo.

IPreviewHandlerVisuals::SetFont

Armazene essas informações de fonte e use-as durante a renderização quando quiser exibir texto consistente com as configurações atuais do Windows Vista.

IPreviewHandlerVisuals::SetTextColor

Armazene essas informações de cor de texto e use-as durante a renderização quando quiser exibir texto consistente com as configurações atuais do Windows Vista.

Manipuladores de pré-visualização e anfitrião de pré-visualização do shell

Como registrar um manipulador de visualização

Diretrizes do manipulador de visualização