Delen via


Venstermodus gebruiken

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Notitie

Het verouderde Video Renderer-filter maakt altijd gebruik van de venstermodus. De filters VMR-7 en VMR-9 maken standaard gebruik van de venstermodus, maar bieden ook ondersteuning voor de modus zonder venster.

 

In de venstermodus maakt de video-renderer een eigen venster waarin de videoframes worden geschilderd. Tenzij u anders opgeeft, is dit venster een venster op het hoogste niveau met zijn eigen randen en titelbalk. Meestal voegt u het videovenster echter toe aan een toepassingsvenster, zodat de video is geïntegreerd in de gebruikersinterface van uw toepassing. Hiervoor zijn de volgende stappen vereist:

  1. Query uitvoeren voor IVideoWindow.
  2. Stel het bovenliggende venster in.
  3. Stel nieuwe vensterstijlen in.
  4. Plaats het videovenster in het eigenaarsvenster.
  5. Informeer het videovenster van WM_MOVE berichten.

Vraag voor IVideoWindow

Voordat u begint met afspelen, voert u een query uit op filtergrafiekbeheer voor de IVideoWindow-interface:

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

Het Hoofdvenster instellen

Om het bovenliggende venster in te stellen, roept u de methode IVideoWindow::put_Owner aan met een handle naar uw applicatievenster. Deze methode gebruikt een variabele van het type OAHWND, dus cast de handle naar dit type:

pVidWin->put_Owner((OAHWND)hwnd);

nieuwe vensterstijlen instellen

Wijzig de stijl van het videovenster door de methode IVideoWindow::put_WindowStyle aan te roepen.

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

Met de vlag WS_CHILD wordt het venster ingesteld als een kindvenster en met de vlag WS_CLIPSIBLINGS zorgt ervoor dat het venster niet binnen het clientgebied van een ander kindvenster wordt getekend.

het videovenster plaatsen

Als u de positie van de video ten opzichte van het clientgebied van het toepassingsvenster wilt instellen, roept u de methode IVideoWindow::SetWindowPosition aan. Deze methode gebruikt een rechthoek die de linkerrand, bovenrand, breedte en hoogte van het videovenster aangeeft. Met de volgende code wordt bijvoorbeeld het videovenster uitgerekt zodat het volledige clientgebied van het bovenliggende venster past:

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

Als u de systeemeigen grootte van de video wilt ophalen, belt u de IBasicVideo::GetVideoSize methode in Filter Graph Manager. U kunt deze informatie gebruiken om de video te schalen en de juiste hoogte-breedteverhouding te behouden.

Antwoorden op WM_MOVE berichten

Voor de beste prestaties moet u de video-renderer waarschuwen wanneer het venster wordt verplaatst terwijl de grafiek wordt onderbroken. Roep de methode IVideoWindow::NotifyOwnerMessage aan om het WM_MOVE bericht door te sturen:

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

Als de renderer een hardware-overlay gebruikt, zorgt deze melding ervoor dat de renderer de overlaypositie bijwerkt. (De VMR-9 gebruikt geen overlays, dus u hoeft deze methode niet aan te roepen als u de VMR-9 gebruikt.)

Opschonen

Voordat de toepassing wordt afgesloten, stopt u de grafiek en stelt u de eigenaar van het videovenster opnieuw in op NULL-. Anders worden vensterberichten mogelijk verzonden naar het verkeerde venster, wat waarschijnlijk fouten veroorzaakt. U kunt ook het videovenster verbergen, anders ziet u mogelijk een videoafbeelding die tijdelijk op het scherm flikkert:

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

Notitie

Als de ouder van het videovenster een kindvenster van uw hoofdtoepassingsvenster is (met andere woorden, als het videovenster een kind van een ander venster is), moet u het videovenster maken met CoCreateInstance en toevoegen aan de grafiek, in plaats van de Filter Graph Manager de video-renderer toe te laten voegen tijdens Intelligent Connect. Dit zorgt ervoor dat het videovenster en het venster van uw kind tegelijkertijd opnieuw worden geschilderd. Anders kan het kindvenster over het videovenster heen tekenen.

 

Video Rendering