Udostępnij za pośrednictwem


Korzystanie z trybu okiennego

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod, jeśli to możliwe, używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w Media Foundation, zamiast DirectShow. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Uwaga

Starsza wersja filtru renderowania wideo zawsze używa trybu okiennego. Filtry VMR-7 i VMR-9 domyślnie używają trybu okiennego, ale także obsługują tryb bez okien.

 

W trybie okna renderator wideo tworzy własne okno, w którym maluje klatki wideo. Jeśli nie określisz inaczej, to okno jest oknem najwyższego poziomu z własnym obramowaniem i paskiem tytułu. W większości przypadków jednak do okna aplikacji zostanie dołączona okno wideo, dzięki czemu wideo zostanie zintegrowane z interfejsem użytkownika aplikacji. Wymaga to wykonania następujących czynności:

  1. Zapytanie dotyczące IVideoWindow.
  2. Ustaw okno nadrzędne.
  3. Ustaw nowe style okien.
  4. Umieść okno wideo wewnątrz okna właściciela.
  5. Powiadom okno wideo o komunikatach WM_MOVE.

Zapytanie dotyczące IVideoWindow

Przed rozpoczęciem odtwarzania zapytaj menedżera Filter Graph o interfejs IVideoWindow:

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

Ustaw okno nadrzędne

Aby ustawić okno nadrzędne, wywołaj metodę IVideoWindow::put_Owner z uchwytem do okna aplikacji. Ta metoda przyjmuje zmienną typu OAHWND, więc rzutuj uchwyt na ten typ.

pVidWin->put_Owner((OAHWND)hwnd);

Ustaw Nowe Style Okien

Zmień styl okna wideo, wywołując metodę IVideoWindow::put_WindowStyle.

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

Flaga WS_CHILD ustawia okno jako okno podrzędne, a flaga WS_CLIPSIBLINGS uniemożliwia rysowanie okna wewnątrz obszaru klienta innego okna podrzędnego.

położenie okna wideo

Aby ustawić położenie filmu wideo względem obszaru klienta okna aplikacji, wywołaj metodę IVideoWindow::SetWindowPosition. Ta metoda przyjmuje prostokąt określający lewą krawędź, górną krawędź, szerokość i wysokość okna wideo. Na przykład poniższy kod rozciąga okno odtwarzacza wideo tak, aby pasowało do całego obszaru klienta okna nadrzędnego.

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

Aby uzyskać natywny rozmiar filmu wideo, wywołaj metodę IBasicVideo::GetVideoSize w Menedżerze filtru programu Graph. Możesz użyć tych informacji, aby skalować wideo i zachować prawidłowy współczynnik proporcji.

Reaguj na komunikaty WM_MOVE

Aby uzyskać najlepszą wydajność, należy powiadomić program renderujący wideo za każdym razem, gdy okno się przesuwa, gdy wykres jest wstrzymany. Wywołaj metodę IVideoWindow::NotifyOwnerMessage, aby przekazać komunikat WM_MOVE:

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

Jeśli program renderator używa nakładki sprzętowej, to powiadomienie powoduje zaktualizowanie położenia nakładki przez program renderatora. (Maszyna wirtualna VMR-9 nie używa nakładek, więc nie trzeba wywoływać tej metody, jeśli używasz maszyny wirtualnej VMR-9).

Czyszczenie

Przed zakończeniem działania aplikacji zatrzymaj graf i zresetuj właściciela okna wideo, aby wartość NULL. W przeciwnym razie komunikaty okien mogą być wysyłane do nieprawidłowego okna, co może powodować błędy. Ponadto, ukryj okno wideo, aby uniknąć chwilowego migotania obrazu na ekranie.

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

Notatka

Jeśli element nadrzędny okna wideo jest elementem podrzędnym głównego okna aplikacji (innymi słowy, jeśli okno wideo jest elementem podrzędnym elementu podrzędnego), należy utworzyć okno wideo przy użyciu CoCreateInstance i dodać je do grafu, zamiast zezwalać menedżerowi grafu filtrującego na dodawanie renderera wideo w trakcie Intelligent Connect. Dzięki temu okno wideo i okno podrzędne zostaną przemalowane w tym samym czasie. W przeciwnym razie okno podrzędne może zostać malowane przez okno wideo.

 

Renderowanie wideo