Dela via


Använda fönsterläge

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Anteckning

Det äldre Video Renderer-filtret använder alltid fönsterläge. VMR-7- och VMR-9-filtren använder fönsterläge som standard, men stöder även fönsterlöst läge.

 

I fönsterläge skapar videoåtergivningen ett eget fönster där videoramarna målas. Om du inte anger något annat är det här fönstret ett toppnivåfönster med egna kantlinjer och namnlister. För det mesta bifogar du dock videofönstret till ett programfönster, så att videon integreras i ditt programgränssnitt. Detta kräver följande steg:

  1. Sök efter IVideoWindow.
  2. Ställ in det överordnade fönstret.
  3. Ange nya fönsterformat.
  4. Placera videofönstret i ägarfönstret.
  5. Meddela videofönstret om WM_MOVE-meddelanden.

Sök efter IVideoWindow

Innan du startar uppspelningen frågar du Filter Graph Manager efter gränssnittet IVideoWindow:

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

Ange det överordnade fönstret

Om du vill ange det överordnade fönstret anropar du metoden IVideoWindow::put_Owner med ett handtag till programfönstret. Den här metoden tar en variabel av typen OAHWND, så omvandla handtaget till den här typen:

pVidWin->put_Owner((OAHWND)hwnd);

Ange nya fönsterformat

Ändra videofönstrets stil genom att kalla på metoden IVideoWindow::put_WindowStyle.

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

Flaggan WS_CHILD anger att fönstret är ett underordnat fönster, och flaggan WS_CLIPSIBLINGS förhindrar att fönstret ritas inuti klientområdet i ett annat underordnat fönster.

Placera videofönstret

Om du vill ange videons position i förhållande till programfönstrets klientområde anropar du metoden IVideoWindow::SetWindowPosition. Den här metoden tar en rektangel som anger videofönstrets vänsterkant, övre kant, bredd och höjd. Följande kod sträcker till exempel ut videofönstret så att det passar hela klientområdet i det överordnade fönstret:

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

Om du vill hämta videons ursprungliga storlek anropar du metoden IBasicVideo::GetVideoSize i Filter Graph Manager. Du kan använda den informationen för att skala videon och behålla rätt proportioner.

Besvara WM_MOVE Meddelanden

För bästa prestanda bör du meddela videoåtergivningen när fönstret flyttas medan grafen pausas. Anropa metoden IVideoWindow::NotifyOwnerMessage för att vidarebefordra WM_MOVE meddelande:

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

Om renderaren använder ett maskinvaruöverlägg gör den här aviseringen att renderaren uppdaterar överläggspositionen. (VMR-9 använder inte överlägg, så du behöver inte anropa den här metoden om du använder VMR-9.)

Städa upp

Innan programmet avslutas stoppar du diagrammet och återställer videofönstrets ägare till NULL. Annars kan fönstermeddelanden skickas till fel fönster, vilket sannolikt kommer att orsaka fel. Dölj också videofönstret, annars kan du se en videobild flimmer på skärmen tillfälligt:

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

Anteckning

Om videofönstrets förälder är ett barn till ditt huvudprogramfönster (med andra ord, om videofönstret är ett barn till ett barn), bör du skapa videofönstret med CoCreateInstance och lägga till det i diagrammet, istället för att låta Filter Graph Manager lägga till videorenderaren under Intelligent Connect. Detta säkerställer att videofönstret och ditt underordnade fönster målas om samtidigt. Annars kan det underordnade fönstret målas över videofönstret.

 

videoåtergivning