Partilhar via


Usando o modo de janela

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Observação

O filtro de renderização de vídeo legado usa sempre o modo de janela. Os filtros VMR-7 e VMR-9 usam o modo de janela por padrão, mas também suportam o modo sem janelas.

 

No modo de janela, o renderizador de vídeo cria sua própria janela onde pinta os quadros de vídeo. A menos que você especifique o contrário, esta janela é uma janela de nível superior com suas próprias bordas e barra de título. Na maioria das vezes, no entanto, você anexará a janela de vídeo a uma janela do aplicativo, para que o vídeo seja integrado à interface do usuário do aplicativo. Isso requer as seguintes etapas:

  1. Interrogação para IVideoWindow.
  2. Defina a janela pai.
  3. Defina novos estilos de janela.
  4. Posicione a janela de vídeo dentro da janela do proprietário.
  5. Notifique a janela de vídeo sobre mensagens WM_MOVE.

consulta para IVideoWindow

Antes de iniciar a reprodução, interrogue o Filter Graph Manager pela interface IVideoWindow:

IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

Definir a janela pai

Para definir a janela pai, chame o método IVideoWindow::put_Owner com um identificador para a janela da sua aplicação. Este método usa uma variável do tipo OAHWND, portanto, converta o identificador para este tipo:

pVidWin->put_Owner((OAHWND)hwnd);

Definir novos estilos de janela

Altere o estilo da janela de vídeo chamando o método IVideoWindow::put_WindowStyle:

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

O sinalizador WS_CHILD define a janela como uma janela filha e o sinalizador WS_CLIPSIBLINGS impede que a janela se desenhe dentro da área cliente de outra janela filha.

Posicionar a janela de vídeo

Para definir a posição do vídeo em relação à área do cliente da janela do aplicativo, chame o IVideoWindow::SetWindowPosition método. Esse método usa um retângulo que especifica a borda esquerda, a borda superior, a largura e a altura da janela de vídeo. Por exemplo, o código a seguir estende a janela de vídeo para caber em toda a área do cliente da janela pai:

RECT rc;
GetClientRect(hwnd, &rc);
pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);

Para obter o tamanho nativo do vídeo, chame o métodoIBasicVideo::GetVideoSize no Gerenciador de Gráficos de Filtro. Você pode usar essas informações para dimensionar o vídeo e manter a proporção correta.

Responder a WM_MOVE mensagens

Para obter o melhor desempenho, você deve notificar o renderizador de vídeo sempre que a janela se mover enquanto o gráfico estiver pausado. Chame o IVideoWindow::NotifyOwnerMessage método para encaminhar a mensagem WM_MOVE:

// (Inside your WindowProc)
case WM_MOVE:
    pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam);
    break;

Se o renderizador estiver usando uma sobreposição de hardware, essa notificação fará com que o renderizador atualize a posição de sobreposição. (O VMR-9 não usa sobreposições, portanto, você não precisa chamar esse método se estiver usando o VMR-9.)

Limpar

Antes que o aplicativo encerre, pare o gráfico e redefina o proprietário da janela de vídeo para NULL. Caso contrário, as mensagens da janela podem ser enviadas para a janela errada, o que provavelmente causará erros. Além disso, oculte a janela de vídeo, ou então você pode ver uma imagem de vídeo cintilar na tela momentaneamente:

pControl->Stop(); 
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);  

Observação

Se o pai da janela de vídeo for filho da janela principal da aplicação (em outras palavras, se a janela de vídeo for filha de um filho), deve criar a janela de vídeo usando CoCreateInstance e adicioná-la ao gráfico, em vez de permitir que o Gestor do Gráfico de Filtros adicione o renderizador de vídeo durante o Intelligent Connect. Isso garante que a janela de vídeo e a janela do seu filho sejam repintadas ao mesmo tempo. Caso contrário, a janela filho pode sobrepor a janela de vídeo.

 

Renderização de vídeo