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
Im Eventloop wird nur auf Ereignisse reagiert, das Zeichnen ohne jegliches Ereignis sollte tunlichst nicht gemacht werden.
Genausowenig wie ein Delay im Eventloop :freak:
#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

Code: Alles auswählen

Repeat
    Event = WindowEvent ()
...
Until()
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

Code: Alles auswählen

Repeat
    Event = WindowEvent ()
...
Until()
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