LeftMouseKlick Event wird nicht erkannt
Verfasst: 30.11.2016 12:59
Hallo zusammen,
nach dem das Problem mit der Trackbar beim Abspielen eines Videos ja gelöst wurde [http://www.purebasic.fr/german/viewtopi ... =3&t=29921] entsteht bei weiter schreiten in diesem Projekt ein neues Problem.
Nachdem das Video gestoppt wurde, wollte ich eine Linie mittels 2DDraw Funktion LineXY() zeichnen. Dazu 2 LeftMouseKlick Events abfangen, Maus X/Y Positionen merken und zeichnen. Das Problem ist, sobald sich die Maus über dem Videobild im Fenster befindet, kommt kein WindowEvent() mehr an. Mausklicks können nicht mehr ausgelesen werden.
Hier habe ich in der Pocedure DrawLine() bewusst auf WaitWindowEvent() gesetzt, da hier mit der Maus gearbeitet wird. Selbst wenn ich hier auf WindowEvent() gehe wird der Mausklick nicht erfasst.
(Bitte erst Stop drücken und anschließend "Draw Me".)
Mir ist nicht ganz eingängig warum das über dem Videobild zu einem Problem führt und was ich dagegen tun kann.
.
nach dem das Problem mit der Trackbar beim Abspielen eines Videos ja gelöst wurde [http://www.purebasic.fr/german/viewtopi ... =3&t=29921] entsteht bei weiter schreiten in diesem Projekt ein neues Problem.
Nachdem das Video gestoppt wurde, wollte ich eine Linie mittels 2DDraw Funktion LineXY() zeichnen. Dazu 2 LeftMouseKlick Events abfangen, Maus X/Y Positionen merken und zeichnen. Das Problem ist, sobald sich die Maus über dem Videobild im Fenster befindet, kommt kein WindowEvent() mehr an. Mausklicks können nicht mehr ausgelesen werden.
Hier habe ich in der Pocedure DrawLine() bewusst auf WaitWindowEvent() gesetzt, da hier mit der Maus gearbeitet wird. Selbst wenn ich hier auf WindowEvent() gehe wird der Mausklick nicht erfasst.
(Bitte erst Stop drücken und anschließend "Draw Me".)
Code: Alles auswählen
EnableExplicit
If Not InitMovie()
MessageRequester("Fehler","Kann Movie Bibliothek nicht öffnen",#MB_ICONERROR)
End
EndIf
Enumeration
#moviewin
#moviectrl
#startstop01
#speedup
#tracbar
#movie
#drawimage
#drawme
#BasicImage
EndEnumeration
Global FileName.s
Global width.i, height.i, movielen.i, SlowmoThread.i, RunMovThread.i, position.q, speedpos.q
Global event.i, EventWin.i, ClickStatus.i=0
;OpenWindow(#moviewin,100,140,640,480,"Movie")
OpenWindow(#moviectrl,10,10,640,90,"Movie Control")
ButtonGadget(#startstop01,3,3,150,30,"Start/Stop",#PB_Button_Toggle)
ButtonGadget(#speedup,160,3,150,30,"Slowmo",#PB_Button_Toggle)
ButtonGadget(#drawme,320,3,150,30,"Draw Me")
TrackBarGadget(#tracbar,3,70,300,20,1,100)
Procedure tracbar(speedpos)
SetGadgetState(#tracbar,speedpos)
EndProcedure
Procedure playmov(value.i)
If value = 0 ;start Movie
PlayMovie(#movie,WindowID(#moviectrl))
ElseIf value = 1 ;Pause movie
PauseMovie(#movie)
ElseIf value = 2 ;restart movie
ResumeMovie(#movie)
EndIf
EndProcedure
Procedure speedup(speedpos.i)
Repeat
speedpos + 1
MovieSeek(#movie,speedpos)
playmov(2)
playmov(1)
Delay(200)
tracbar(speedpos)
PostEvent(#tracbar,#moviectrl,#tracbar)
SetWindowTitle(#moviectrl,"Movie Position: " + Str(speedpos))
ForEver
EndProcedure
Procedure Drawline()
Protected mxposs.i, myposs.i, mxpose.i, mypose.i, ClickStatus.i = 0, ievent.i
Repeat
ievent = WaitWindowEvent()
Debug ievent
Select ievent
Case #PB_Event_LeftClick
Debug "WindowEvent(): " + Str(ievent)
If ClickStatus = 0
Debug "Clickstatus: 0"
mxposs = WindowMouseX(#moviectrl)
myposs = WindowMouseY(#moviectrl)
ClickStatus + 1
ElseIf ClickStatus = 1
Debug "Clickstatus: 1"
mxpose = WindowMouseX(#moviectrl)
mypose = WindowMouseY(#moviectrl)
ClickStatus + 1
Else
Circle( 175, 175, 50, RGBA(255, 0, 0, 128))
LineXY(mxposs,myposs,mxpose,mypose,RGBA(255,0,0,128))
EndIf
Debug "Clickstatus: 2"
EndSelect
SetWindowTitle(#moviectrl,"mousex: " + Str(WindowMouseX(#moviectrl)) + " / mousey: " + Str(WindowMouseY(#moviectrl)))
Until ClickStatus > 1
LineXY(mxposs,myposs,mxpose,mypose,RGBA(255,0,0,128))
EndProcedure
FileName = OpenFileRequester("Movie","","Videodateien|*.avi;*.mpg;*.mkv|Alle Dateien|*.*",0)
If FileName <> ""
If LoadMovie(#movie,FileName) = 0
MessageRequester("Fehler","Konnte Videodatei nicht öffnen",#MB_ICONERROR)
End
Else
width = MovieWidth(#movie)
height = MovieHeight(#movie)
movielen = MovieLength(#movie)
SetGadgetAttribute(#tracbar,#PB_TrackBar_Maximum,movielen)
ResizeWindow(#moviectrl,#PB_Ignore,#PB_Ignore,width,height+105)
ResizeMovie(#movie,0,100,width,height)
playmov(0)
Repeat
Delay(10)
event = WindowEvent()
EventWin = EventWindow()
If EventWin = #moviectrl
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #startstop01
If GetGadgetState(#startstop01) = 1
position = MovieStatus(#movie)
playmov(1)
SetWindowTitle(#moviectrl,"Movie " + Str(position))
DisableGadget(#speedup,1)
Else
SetWindowTitle(#moviectrl,"Movie ")
playmov(2)
DisableGadget(#speedup,0)
EndIf
Case #speedup
If GetGadgetState(#speedup) = 1
speedpos = MovieStatus(#movie)
playmov(1)
SlowmoThread = CreateThread(@speedup(),speedpos)
If IsThread(SlowmoThread)
DisableGadget(#startstop01,1)
EndIf
Else
If IsThread(SlowmoThread)
KillThread(SlowmoThread)
DisableGadget(#startstop01,0)
EndIf
playmov(2)
EndIf
Case #tracbar
If GetGadgetState(#startstop01) = 1
speedpos = GetGadgetState(#tracbar)
MovieSeek(#movie,speedpos)
playmov(2)
playmov(1)
SetGadgetState(#tracbar,speedpos)
EndIf
Case #drawme
If CreateImage(#drawme,width,height,32) And StartDrawing(ImageOutput(#drawme))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0, 0, width, height, $00000000)
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle( 75, 75, 50, RGBA(255, 0, 0, 128))
Circle(125, 75, 50, RGBA( 0, 255, 0, 128))
Circle(100, 125, 50, RGBA( 0, 0, 255, 128))
Drawline()
DrawImage(ImageID(#drawme),0,0)
StopDrawing()
ImageGadget(#BasicImage,0,100,0,0,ImageID(#drawme))
EndIf
EndSelect
Case #PB_Event_CloseWindow
Break
Default
speedpos = MovieStatus(#movie)
If speedpos > 0
SetGadgetState(#tracbar,speedpos)
EndIf
EndSelect
Else
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Default
Debug EventGadget()
EndSelect
EndSelect
EndIf
ForEver
StopMovie(#movie)
FreeMovie(#movie)
EndIf
EndIf
End .