Sdílet prostřednictvím


Použití režimu okna

[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, MMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]

Poznámka

Starší filtr video rendereru vždy používá režim oken. Filtry VMR-7 a VMR-9 používají ve výchozím nastavení režim oken, ale také podporují režim bez oken.

 

V režimu oken vytvoří renderer vlastní okno, ve kterém vykresluje snímky videa. Pokud neurčíte jinak, jedná se o okno nejvyšší úrovně s vlastním ohraničením a záhlavím. Ve většině případů ale připojíte okno videa k okně aplikace, aby bylo video integrované do uživatelského rozhraní aplikace. To vyžaduje následující kroky:

  1. Dotaz pro IVideoWindow.
  2. Nastavte nadřazené okno.
  3. Nastavte nové styly oken.
  4. Umístěte okno videa do okna vlastníka.
  5. Upozorněte okno videa na zprávy WM_MOVE.

dotaz pro IVideoWindow

Před zahájením přehrávání zadejte dotaz na Správce grafů filtru pro rozhraní IVideoWindow:

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

Nastavit nadřazené okno

Chcete-li nastavit nadřazené okno, zavolejte metodu IVideoWindow::put_Owner s popisovačem okna vaší aplikace. Tato metoda přebírá proměnnou typu OAHWND, takže přetypujte popisovač na tento typ:

pVidWin->put_Owner((OAHWND)hwnd);

nastavit nové styly oken

Změňte styl okna videa voláním metody IVideoWindow::put_WindowStyle:

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

Příznak WS_CHILD nastaví okno jako podřízené okno, zatímco příznak WS_CLIPSIBLINGS zabrání oknu kreslit v klientské oblasti jiného podřízeného okna.

umístění okna videa

Chcete-li nastavit pozici videa vzhledem k oblasti klienta okna aplikace, zavolejte metodu IVideoWindow::SetWindowPosition. Tato metoda přebírá obdélník, který určuje levý okraj, horní okraj, šířku a výšku okna videa. Například následující kód roztáhne okno videa tak, aby odpovídalo celé klientské oblasti nadřazeného okna:

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

Pokud chcete získat nativní velikost videa, zavolejte metodu IBasicVideo::GetVideoSize ve Správci grafů filtru. Tyto informace můžete použít ke škálování videa a zachování správného poměru stran.

Odpovědět na WM_MOVE zprávy

Pokud chcete dosáhnout nejlepšího výkonu, měli byste upozornit vykreslovač videa pokaždé, když se okno přesune a graf je pozastavený. Zavolejte IVideoWindow::NotifyOwnerMessage metodu pro přeposlání zprávy WM_MOVE:

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

Pokud renderer používá hardwarové překrytí, toto oznámení způsobí aktualizaci pozice tohoto překrytí rendererem. (VMR-9 nepoužívá překryvné vrstvy, takže pokud používáte VMR-9, nemusíte tuto metodu volat.)

Úklid

Před ukončením aplikace zastavte graf a resetujte vlastníka okna videa tak, aby NULL. Jinak se zprávy oken můžou posílat do nesprávného okna, což může způsobit chyby. Skryjte také okno videa nebo se může na obrazovce občas blikat obrázek videa:

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

Poznámka

Pokud je rodičovské okno videa dítětem hlavního okna vaší aplikace (jinými slovy, pokud je okno videa dítětem podřízeného okna), měli byste okno videa vytvořit pomocí CoCreateInstance a přidat ho do grafu, místo aby Správce grafu filtru přidal video renderer během Intelligent Connect. Tím zajistíte, že se okno videa a vaše podřízené okno překreslí současně. Jinak může podřízené okno překrýt okno videa.

 

vykreslování videa