Seite 1 von 1

Movie und die Frage nach dem wie (Maushandling)

Verfasst: 10.04.2013 21:44
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...

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

Verfasst: 10.04.2013 21:53
von NicTheQuick
Kann man den Film nicht in ein CanvasGadget rendern und dann dessen Möglichkeit nutzen um Mausbewegungen und Klicks auszuwerten?

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

Verfasst: 11.04.2013 00:45
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 !

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

Verfasst: 11.04.2013 01:59
von NicTheQuick
Probieren geht über Studieren. :wink:

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

Verfasst: 11.04.2013 02:10
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 

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

Verfasst: 11.04.2013 07:49
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

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

Verfasst: 11.04.2013 10:25
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....

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

Verfasst: 11.04.2013 12:17
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?!

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

Verfasst: 11.04.2013 12:37
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 ;)

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

Verfasst: 11.04.2013 14:21
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