![]() |
VideoWindowEx bei Resize verschieben
Hallo,
um Videos anzuzeigen nutze ich VideoWindowEx. Funktioniert auch ganz gut. Aber ich möchte, dass das Video immer in der Mitte meines Fensters angezeigt wird, auch wenn das Fenster verkleinert oder vergrößert wird. Hierzu nutze ich die Top- und Left-Eigentschaft von VideoWindowEx. Dabei wird allerdings nur ein schwarzes Rechteck, nicht aber das Video selbst, verschoben. Beim Verschieben des ganzen Fensters wandert das Video mit. Es kann also nichts mit Overlay zu tun haben... Kann es daran liegen, dass ich FilterGraph nutze? Kennt jemand eine Möglichkeit das Video selbst (auch wenn es gerade abgespielt wird) innerhalb eines Fensters zu verschieben? Gruß e-gon |
AW: VideoWindowEx bei Resize verschieben
Hi,
evtl hilft dir diese funktion damit wärs glaub ich möglich:
Delphi-Quellcode:
function StretchRectEx(aRect : TRect; VideoAspectRatio : TPoint;
SubtitleHeight, SubtitleNonOverlappedRows, SubtitleMaxRows, VideoVertShift, VideoHorizShift, VideoZoom: integer; StretchRatio : integer; out Centered : boolean): TRect; var imgW, imgH, // video width, height imgWzoom, imgHzoom, // zoomed video width, height rectW, rectH, // destination width, height TmpTop : Integer; // aux for video top begin rectW := aRect.Right - aRect.Left; rectH := aRect.Bottom - aRect.Top; imgW := rectW; imgH := MulDiv(imgW, VideoAspectRatio.Y, VideoAspectRatio.X); if imgH > rectH then begin imgH := rectH; imgW := MulDiv(imgH, VideoAspectRatio.X, VideoAspectRatio.Y); end; imgH := MulDiv(imgH, StretchRatio, 100); TmpTop := (rectH - imgH) div 2; if (rectH - (TmpTop + imgH)) < (SubtitleHeight * SubtitleNonOverlappedRows) then Centered := true else begin Centered := false; TmpTop := (rectH - imgH - SubtitleMaxRows * SubtitleHeight) div 2; end; imgWzoom := MulDiv(imgW, VideoZoom, 100); imgHzoom := MulDiv(imgH, VideoZoom, 100); TmpTop := TmpTop + (imgH - imgHzoom) div 2; Result := Bounds(aRect.Left + (rectW - imgWzoom) div 2 + VideoHorizShift,aRect.Top + TmpTop + VideoVertShift, imgWzoom, imgHzoom); end; ach ja und wie man sie ausführt:
Delphi-Quellcode:
var
BasicVideo2 : IBasicVideo2; R : TRect; centering : boolean; begin Centering := True; if Succeeded(ActiveFiltergraph.QueryInterface(IID_IBasicVideo2, BasicVideo2)) then begin R := StretchRectEx(MRVideoWindow.ClientRect, // BoundsRect, Point(Trunc(ASpx.Value),Trunc(Aspy.Value)),0,0,0, Trunc(Vertshift.Value), Trunc(horzshift.Value), Trunc(ZoomX.Value), 100, centering); BasicVideo2.SetDestinationPosition(R.Left, R.Top, (R.Right - R.Left), (R.Bottom - R.Top)); BasicVideo2 := nil; end; |
AW: VideoWindowEx bei Resize verschieben
Danke für die schnelle Antwort! Werde ich gleich mal ausprobieren...
|
AW: VideoWindowEx bei Resize verschieben
Nachdem BasicVideo2.SetDestinationPosition auch nicht den erhofften Erfolg brachte, habe ich nach vielen Versuchen nun endlich eine simple Lösung gefunden:
Wenn man die Eigenschaft Width oder Height von VideoWindowEx zuerst auf 0 setzt und dann den eigentlichen Wert zuweißt, wird VideoWindowEx gezwungen sich selbst zu aktualisieren und nimmt dabei auch gleich die neuen Werte von Top und Left an. Vielleicht nicht die eleganteste Lösung, aber effektiv und funktioniert selbst bei laufendem Video! Gruß e-gon |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz