Witajcie. Zastanawiam sie nad pewnym rozwiazaniem ale nie wiem czy jest ono w ogole mozliwe do zrealizowania. Na kompie ktory ma karte graficzna mogaca obsluzyc dwa monitory na raz czyli tzw Dual View uruchamiam dwa programy napisane w delphi ktore odtwarzaja przez dspacka dwa rozne filmiki. Czy mozna zrobic tak zeby jeden program/filmik pokazywany byl na jednym monitorze a drugi na drugim ?
Pozdrawiam.
- Rejestracja:prawie 17 lat
- Ostatnio:około rok

- Rejestracja:ponad 19 lat
- Ostatnio:prawie 4 lata
Musisz utworzyć dwa osobne Grafy korzystając z video rendera VMR lub EVR.
(Video renderer overlay ma możliwość wyświetlania obrazu tylko na jednym monitorze)
Następnie przypisujesz okno video1 do monitora1, zaś okno video2 do monitora2.
FilterGraph1.ClearGraph;
FilterGraph2.ClearGraph;
FilterGraph1.Active := True;
FilterGraph2.Active := True;
FilterGraph2.RenderFile('xy.avi');
FilterGraph1.RenderFile('yz.avi');
FilterGraph1.Play;
FilterGraph2.Play;

- Rejestracja:ponad 19 lat
- Ostatnio:prawie 4 lata
Troszkę będziesz musiał pokombinować, zobacz do pliku dspack.pas jak wyglada procedura "procedure TVideoWindow.SetFullScreen(Value: boolean);"
Idea jest taka, że tworzysz nowe okno o rozmiarach monitora1 lub monitora2. Lub zmieniasz parametry aktualnego okna odtwarzającego video, by posiadało rozmiary aktualnego monitora.
//przykładowe pobranie rozmiarów danego monitora
var
MBounds,MBounds2: TRect; //Size of monitor screen
Begin
MBounds2 := Screen.monitors[1].BoundsRect //(1280, 0, 2304, 768, (1280, 0), (2304, 768)) TV lub monitor 2
MBounds := Screen.monitors[0].BoundsRect; //(0, 0, 1280, 1024, (0, 0), (1280, 1024)) monitor 1
end;
Albo:
var
Monitor,Monitor2 : TMonitor;
Begin
Monitor := Screen.Monitors[0];
Monitor2 := Screen.Monitors[1];
end;
//w przypadku Trybu EVR robię tak:
with form1 do
begin
Foldbounds := Form1.BoundsRect;//zapamietuje aktualne rozmiary
BorderIcons := [];
BorderStyle := bsNone;
menu := nil;
//ustawiam rozmiary i pozycje formy na danym monitorze
SetBounds(MBounds.Left, MBounds.Top, (MBounds.Right-MBounds.Left),(MBounds.Bottom-MBounds.Top));
end;
//interfejs do renderera video ustawi obraz
if assigned (FDisplayControl) then FDisplayControl.SetVideoWindow(form1.Handle);
W przypadku WMR jest w kodzie dspacka coś takiego:
//zmień styl okna
CheckDSError(FVideoWindow.put_Owner(0));
CheckDSError(FVideoWindow.put_WindowStyle(FWindowStyle and not(WS_BORDER or WS_CAPTION or WS_THICKFRAME)));
StyleEX := FWindowStyleEx and not(WS_EX_CLIENTEDGE or WS_EX_STATICEDGE
or WS_EX_WINDOWEDGE or WS_EX_DLGMODALFRAME);
if FTopMost then StyleEX := StyleEX or WS_EX_TOPMOST;
CheckDSError(FVideoWindow.put_WindowStyleEx(StyleEX));
//interfejs IVideoWindow ustawi pozycje okna na danym monitorze
FVideoWindow.SetWindowPosition ((Monitor.Left),(Monitor.Top),(Monitor.Width),(Monitor.Height));
Nie próbowałem wyświetlania dwóch filmów. Ale spróbowałbym tak:
Musisz wyrenderować strumienie, następnie pobrać interfejsy do IVideoWindow
CheckDSError(FBaseFilter.QueryInterface(IVideoWindow, FVideoWindow));
CheckDSError(FBaseFilter2.QueryInterface(IVideoWindow, FVideoWindow2));
Zmieniasz style okien by zajęły cały obszar ekranu i przypisujesz im video z renderera:
FVideoWindow.SetWindowPosition ((Monitor.Left),(Monitor.Top),(Monitor.Width),(Monitor.Height))
FVideoWindow2.SetWindowPosition ((Monitor2.Left),(Monitor2.Top),(Monitor2.Width),(Monitor2.Height))
Myślę, iż aby to w prosty sposób zrobić, musiałbyś zmodyfikować plik dspack.pas, a konkretnie procedurę
TVideoWindow.SetFullScreen(Value: boolean); na:
TVideoWindow.SetFullScreen(Value: boolean; MonitorNumer : integer);"
Dalej już chyba sobie poradzisz :)