Movie und die Frage nach dem wie (Maushandling)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Movie und die Frage nach dem wie (Maushandling)

Beitrag von Ghosty1967 »

Ich habe was altes von mir ausgegraben und ein paar Fragen sind wieder aufgetaucht...
Bild
Ja, dies ist ein kleiner Movieplayer. Alles funktioniert soweit, was mit der Steuerung über die Maus nichts zu tun hat.
Zur schnellen Erklärung...
Im blauen Bereich wird das Video angezeigt, welches direkt mittels PlayMovie(0, WindowID(0)) auf das Fenster gerendert wird.
Der rote Bereich ist eigentlich ein ImageGadget, in welches die Steuerelemente gezeichnet wurden. nun möchte ich gerne
folgende Funktionen umsetzen.
1. Ein Doppelklick innerhalb des bleuen Bereichs soll ausgewertet werden.
2. Im roten Bereich soll die Mausposition innerhalb des Gadgets und ein einfacher Klick ausgewertet werden.
Ich bekomme das einfach nicht mit den mir bekannten Mitteln (Event Loops) hin. Eventuell wäre ja hier eine Hook-Routine
hilfreich, aber auch da bin ich absolut Talentlos.

Hat da einer eine Idee...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von NicTheQuick »

Kann man den Film nicht in ein CanvasGadget rendern und dann dessen Möglichkeit nutzen um Mausbewegungen und Klicks auszuwerten?
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Bisonte »

Den Film kann ich mir in einem Canvas weniger vorstellen (ich schätze mal das das ganze etwas langsam wäre?),
allerdings die Steuerelemente schon !
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von NicTheQuick »

Probieren geht über Studieren. :wink:
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Derren »

Bisonte hat geschrieben:Den Film kann ich mir in einem Canvas weniger vorstellen (ich schätze mal das das ganze etwas langsam wäre?),
allerdings die Steuerelemente schon !
Hm, möglicherweise ist es langsamer mit bestimmten Videos (Dateigröße, Auflösung, Framerate).
Die mir z.Z. zur Verfügung stehenden Dateien laufen eigentlich flüssig.
Allerdings legt sich der Movie über das CanvasGadget, so dass der Doppelklick das Gadget gar nicht erreicht.

Code: Alles auswählen

;   PureBasic - Movie example file;
;    (c) 2001 - Fantaisie Software

If InitMovie() = 0
	MessageRequester("Error", "Can't initialize movie playback !", 0) 
	End
EndIf

Enumeration 
	#Canvas
EndEnumeration

MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie/Audio files|*.avi;*.mpg;*.asf;*.mp3;*.wav|All Files|*.*", 0)
If MovieName$
	If LoadMovie(0, MovieName$)		
		OpenWindow(0, 100, 150, MovieWidth(0), MovieHeight(0), "PureBasic - Movie")		
		CanvasGadget(#Canvas, 0, 0, MovieWidth(0), MovieHeight(0))			
		PlayMovie(0, GadgetID(#Canvas)) ; Auskommentieren um zu sehen, dass der Doppelklick regulär erkannt wird
		
		Repeat
			event = WaitWindowEvent(20)
			If event = #PB_Event_Gadget
				If EventGadget()=#Canvas
					If EventType() = #PB_EventType_LeftDoubleClick
						Debug "Double Click"
					EndIf 
				EndIf
			EndIf 	
		Until event = #PB_Event_CloseWindow
	Else
		MessageRequester("Error", "Can't load the movie...", 0)
	EndIf
EndIf 

Es scheint überhaupt kein Maus-Klick registriert zu werden. Mausrad jedoch schon... (WindowEvent() gibt 522 zurück, unabhängig von der Richtung)

Folgender Eventloop zum testen:

Code: Alles auswählen

Repeat
    event = WaitWindowEvent(1000)
    Debug event
Until event = #PB_Event_CloseWindow
Bei einem Klick wird "0" ausgegeben, aber das kann's ja wohl nicht sein. Scheint eher so als ob ein Event registriert wurde, PB aber nichts damit anfangen kann, also gibt die Funktion 0 zurück.

KeyboardShortcuts funktionieren jedoch.

Eine Windows-Lösung wäre GetAsyncKeyState_(#VK_LBUTTON) abzufragen und das Delay für einen Doppelklick von Windows auszulesen (Code schwirrt irgendwo hier im Forum oder Code-Archiv herum).


Den einfachen Linksklick auf die Control-Gadgets funktioniert aber ganz normal. Das ist kein Problem.

Code: Alles auswählen

If InitMovie() = 0
	MessageRequester("Error", "Can't initialize movie playback !", 0) 
	End
EndIf

Enumeration 
	#Canvas
	#Controls
EndEnumeration

MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie/Audio files|*.avi;*.mpg;*.asf;*.mp3;*.wav|All Files|*.*", 0)
If MovieName$
	If LoadMovie(0, MovieName$)		
		OpenWindow(0, 100, 150, MovieWidth(0), MovieHeight(0)+40, "PureBasic - Movie")		
		CanvasGadget(#Canvas, 0, 0, MovieWidth(0), MovieHeight(0))			
		CanvasGadget(#Controls,  0, MovieHeight(0), MovieWidth(0), 40)			
		PlayMovie(0, GadgetID(#Canvas)) ; Auskommentieren um zu sehen, dass der Doppelklick erkannt wird
		
		Repeat
			event = WaitWindowEvent(10)
			If event = #PB_Event_Gadget
				If EventGadget() = #Controls
					If EventType() = #PB_EventType_LeftClick
						Debug "Linksklick auf Control Canvas"
					EndIf 
				EndIf 
			EndIf 
			
			
		Until event = #PB_Event_CloseWindow
	Else
		MessageRequester("Error", "Can't load the movie...", 0)
	EndIf
EndIf 
Signatur und so
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Ghosty1967 »

Soweit sogut...
Also, mit dem CanvasGadget funktioniert zwar die Mausabfrage... aber nur solange, solange das Video nicht darauf
gerendert wird. Sobald man PlayMovie mit dem Canvas startet, kommen keine Meldungen mehr vom Gadget...
Ist das bei euch auch so?

Hier mein einfacher Testcode...

Code: Alles auswählen

InitMovie()
If LoadMovie(0, "BreakingBad.avi")
  If OpenWindow(0, 0, 0, MovieWidth(0), MovieHeight(0), #PB_Window_SystemMenu)
    CanvasGadget(0, 0, 0, MovieWidth(0), MovieHeight(0))
    ;Solange die nächste Zeile auskommentiert ist klappt alles...
    ;PlayMovie(0, GadgetID(0))

    Repeat
      pbEvent.l = WaitWindowEvent()
      If pbEvent = #PB_Event_Gadget and EventGadget() = 0
        If EventType() = #PB_EventType_LeftDoubleClick
          Debug "Doppelklick im CanvasGadget"
        ElseIf EventType() = #PB_EventType_LeftButtonDown
          Debug "Klick im CanvasGadget"
        EndIf
      EndIf
    Until pbEvent = #PB_Event_CloseWindow
  EndIf
EndIf
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Bisonte »

Gleiches Phänomen hier. Ich hab dann ein zweites Canvas genommen und das Fenster entsprechend in der Höhe justiert...
Also macht dann wohl auf dem Canvas ein "PlayMovie()" weniger Sinn....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Ghosty1967 »

Also, dann wieder ein ImageGadget für die Videorenderei und ein Canvas für die Steuerung... ich probiere das jetzt mal.
Trotzdem nocheinmal die eigentliche Frage ob man das nicht vielleicht irgendwie über einen Hook lösen kann. Andere Player
reagieren doch auch auf einen Doppelklick im Ausgabebereich?!
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Chimorin »

Es gäbe da eine Möglichkeit über die WindowsAPI:

Code: Alles auswählen

    If GetAsyncKeyState_(#VK_LBUTTON) = 32768
      If mausLinks = #False
        mausFlankeLinks = #True
      EndIf
      mausLinks = #True
    Else
      mausLinks = #False
    EndIf
Da ich für mein Projekt nichts über Mausklick mit der WinAPI gefunden habe (Ich kann die Mauslib nicht benutzen), habe ich mir einen Taktflankenmausklick geschaffen :D
Am Ende der Schleife musst du dann mausFlankeLinks wieder auf #False setzen.
Musst halt noch ein bisschen umändern; Und auf 2 zählen ;)
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Movie und die Frage nach dem wie (Maushandling)

Beitrag von Josh »

Ghosty1967 hat geschrieben:Trotzdem nocheinmal die eigentliche Frage ob man das nicht vielleicht irgendwie über einen Hook lösen kann.
Da es jetzt einen Beispielcode gibt, spiele ich auch mit :wink:
Vergiss diesen Canvaskrampf. Windows only:

Code: Alles auswählen

Define WndTitle .s {100}
Global OldWndProc

Procedure WinCB (hWnd, uMsg, wParam, lParam)

  Select uMsg
    Case #WM_LBUTTONDBLCLK : Debug "DOPPELKLICK"
  EndSelect

  ProcedureReturn CallWindowProc_(OldWndProc, hWnd, uMsg, wParam, lParam)

EndProcedure


InitMovie()
If LoadMovie(0, "BreakingBad.avi")

  OpenWindow(0, 0, 0, MovieWidth(0), MovieHeight(0), "Test", #PB_Window_SystemMenu)
  PlayMovie(0, WindowID(0))

 ;Handle des Moviefensters holen
  hIter = GetWindow_(WindowID(0), #GW_CHILD)
  While hIter
    GetWindowText_(hIter, @WndTitle, 98)
    If WndTitle = "ActiveMovie Window"
      hMovie = hIter
    EndIf
    hIter = GetWindow_(hIter, #GW_HWNDNEXT)
  Wend

 ;Hook auf das Moviefenster
  OldWndProc = SetWindowLongPtr_(hMovie, #GWL_WNDPROC, @WinCB())

  Repeat
    event = WaitWindowEvent()
    If event = #PB_Event_CloseWindow
      SetWindowLongPtr_(hMovie, #GWL_WNDPROC, OldWndProc)
      End
    EndIf
  ForEver

EndIf
Antworten