Seite 1 von 2
AddKeyboardShortcut()
Verfasst: 13.07.2010 15:52
von Ostblock_D
Hallo,
Code erklärt sich denke von selbst ...
Code: Alles auswählen
w = 512
h = 512
rot = 200
gruen = 200
blau = 200
If OpenWindow(0,0,0,w,h,"2D Drawing Beispiel",#PB_Window_SystemMenu | #PB_Window_ScreenCentered )
AddKeyboardShortcut (0, #PB_Shortcut_Up, 1)
CreateImage(0,w,h)
StartDrawing(ImageOutput(0))
Box(0,0,w,h,RGB(255,255,255))
StopDrawing()
Repeat
Event = WaitWindowEvent ()
If EventMenu () = 1
MessageRequester (" Test ", "Pfeiltaste oben gedrückt")
EndIf
StartDrawing(ImageOutput(0))
Circle(w/2,h/2,h/2-100,$00FF00)
Circle(w/2,h/2,h/2-105,$FF0000)
FillArea(w/2,h/2,-1,RGB(rot,gruen,blau)) ; Ersetze -1 durch $00FF00 , und vergleiche das Ergebnis
StopDrawing()
Delay(1000)
Until(rot < 20)
EndIf
... wenn ich jetzt die Pfeiltaste 'nach oben' drücke passiert aber nix. Warum?
vg Daniel
Re: AddKeyboardShortcut()
Verfasst: 13.07.2010 15:55
von Kiffi
Ostblock_D hat geschrieben:Warum?
Darum: Delay(1000)
Grüße ... Kiffi
Re: AddKeyboardShortcut()
Verfasst: 13.07.2010 16:07
von Ostblock_D
hm ... irgendwie hat da noch was gefehlt in meinem Code.
Code: Alles auswählen
w = 512
h = 512
rot = 200
gruen = 200
blau = 200
If OpenWindow(0,0,0,w,h,"2D Drawing Beispiel",#PB_Window_SystemMenu | #PB_Window_ScreenCentered )
AddKeyboardShortcut (0, #PB_Shortcut_Up, 1)
CreateImage(0,w,h)
StartDrawing(ImageOutput(0))
Box(0,0,w,h,RGB(255,255,255))
StopDrawing()
Repeat
Event = WaitWindowEvent ()
StartDrawing(ImageOutput(0))
If EventMenu () = 1
MessageRequester (" Test ", "Pfeiltaste oben gedrückt")
rot=200:gruen=200:blau=200
EndIf
Circle(w/2,h/2,h/2-100,$00FF00)
Circle(w/2,h/2,h/2-105,$FF0000)
rot=rot-1:gruen=gruen-1:blau=blau-1
FillArea(w/2,h/2,-1,RGB(rot,gruen,blau)) ; Ersetze -1 durch $00FF00 , und vergleiche das Ergebnis
StopDrawing()
ImageGadget(0,0,0,w,h,ImageID(0))
Until(rot < 20)
EndIf
Sonst wär die Schleife etwas sinnlos.
Habs auch gleich ohne Delay() gemacht

geht aber trotzdem nicht
Re: AddKeyboardShortcut()
Verfasst: 13.07.2010 16:16
von Mok
Durch das Gadget-Zeichnen in der Eventloop, hat das Fenster immer was zu tun (das Aufbauen eines Gadgets dauert auch seine Zeit). Deshalb: Gadget außerhalb der Loop erstellen und nachher einfach das Bild ändern.
Hier ein fehlerloser & optimierter Code:
Code: Alles auswählen
w = 512
h = 512
rot = 200
gruen = 200
blau = 200
If OpenWindow(0,0,0,w,h,"2D Drawing Beispiel",#PB_Window_SystemMenu | #PB_Window_ScreenCentered )
AddKeyboardShortcut (0, #PB_Shortcut_Up, 1)
CreateImage(0,w,h)
StartDrawing(ImageOutput(0))
Box(0,0,w,h,RGB(255,255,255))
StopDrawing()
ImageGadget(0,0,0,w,h,ImageID(0))
Repeat
Event = WaitWindowEvent ()
If Event = #PB_Event_Menu
If EventMenu () = 1
MessageRequester (" Test ", "Pfeiltaste oben gedrückt")
rot=200:gruen=200:blau=200
EndIf
EndIf
StartDrawing(ImageOutput(0))
Circle(w/2,h/2,h/2-100,$00FF00)
Circle(w/2,h/2,h/2-105,$FF0000)
rot=rot-1:gruen=gruen-1:blau=blau-1
FillArea(w/2,h/2,-1,RGB(rot,gruen,blau)) ; Ersetze -1 durch $00FF00 , und vergleiche das Ergebnis
StopDrawing()
SetGadgetState(0,ImageID(0))
Until(rot < 20)
EndIf
Re: AddKeyboardShortcut()
Verfasst: 13.07.2010 17:06
von ts-soft
I
m Eventloop wird nur auf Ereignisse reagiert, das Zeichnen ohne jegliches Ereignis sollte tunlichst nicht gemacht werden.
Genausowenig wie ein Delay im Eventloop
#PB_Event_Repaint wäre ein geeigneter Platz für das Zeichnen, oder wenns in regelmässigen Abständen erfolgen soll, nach einem Timer-Ereignis.
Re: AddKeyboardShortcut()
Verfasst: 14.07.2010 09:14
von Ostblock_D
ok, danke für die Antworten
was ich jetzt noch nicht verstehe, warum wird nur gezeichnet wenn anscheinend WaitWindowEvent() ausgelöst wird??? Wenn man z.B. die Maus bewegt zeichnet er, wenn nicht dann nicht???
Die Zeichenfunktionen sind doch außerhalb der If-Bedingung.
Daniel
Re: AddKeyboardShortcut()
Verfasst: 14.07.2010 09:38
von Ostblock_D
habs schon
statt
WaitWindowEvent() nehmen ... sonst wartet das Program jedesmal auf ein Event
Re: AddKeyboardShortcut()
Verfasst: 14.07.2010 09:48
von ts-soft
Ostblock_D hat geschrieben:habs schon
statt
WaitWindowEvent() nehmen ... sonst wartet das Program jedesmal auf ein Event
Gerade nicht so machen, damit heizt man nur die CPU!
Entweder beim #PB_EventRePaint, weil nur dann wird gemalt, oder zum Auslösen einen Timer nutzen.
Das Program muß jedesmal auf ein Event warten, das ist der Sinn und Zweck eines EventLoops!
Re: AddKeyboardShortcut()
Verfasst: 14.07.2010 10:02
von Ostblock_D
prinzipiell muss ja in meinem Code kein Event passieren (kann natürlich) ... d.h. dass das program eben nicht warten soll. es soll sozusagen nur jederzeit bereit sein das event zu verarbeiten.
Bietet sich dennoch #PB_EventRePaint an??? Wie würde ich das dann machen?
Daniel
Re: AddKeyboardShortcut()
Verfasst: 14.07.2010 11:36
von ts-soft
Was Du eigentlich erreichen möchtest, ist mir bisher nicht bekannt, habe also mal den Code aus dem Bauch heraus umgestellt:
Code: Alles auswählen
Global rot = 200
Global gruen = 200
Global blau = 200
Procedure Draw()
Static w = 512, h = 512
If rot >= 20
StartDrawing(ImageOutput(0))
Circle(w/2,h/2,h/2-100,$00FF00)
Circle(w/2,h/2,h/2-105,$FF0000)
rot=rot-1:gruen=gruen-1:blau=blau-1
FillArea(w/2,h/2,-1,RGB(rot,gruen,blau)) ; Ersetze -1 durch $00FF00 , und vergleiche das Ergebnis
StopDrawing()
SetGadgetState(0,ImageID(0))
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 512, 512, "2D Drawing Beispiel", #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
AddKeyboardShortcut (0, #PB_Shortcut_Up, 1)
CreateImage(0, 512, 512)
StartDrawing(ImageOutput(0))
Box(0, 0, 512, 512, RGB(255, 255, 255))
StopDrawing()
ImageGadget(0, 0, 0, 512, 512, ImageID(0))
AddWindowTimer(0, 1, 1000)
Repeat
Event = WaitWindowEvent ()
If Event = #PB_Event_Menu
If EventMenu () = 1
MessageRequester (" Test ", "Pfeiltaste oben gedrückt")
rot=200:gruen=200:blau=200
EndIf
ElseIf Event = #PB_Event_Timer And EventTimer() = 1
Draw()
EndIf
Until Event = #PB_Event_CloseWindow
EndIf