AddKeyboardShortcut()

Anfängerfragen zum Programmieren mit PureBasic.
Ostblock_D
Beiträge: 7
Registriert: 06.07.2010 10:45

AddKeyboardShortcut()

Beitrag 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
Prozessor: Intel(R) Core(TM)2 Duo CPU mit je 2 GHz
4GB RAM
Grafikkarte: ATI Mobility Radeon HD 2400
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: AddKeyboardShortcut()

Beitrag von Kiffi »

Ostblock_D hat geschrieben:Warum?
Darum: Delay(1000)

Grüße ... Kiffi
a²+b²=mc²
Ostblock_D
Beiträge: 7
Registriert: 06.07.2010 10:45

Re: AddKeyboardShortcut()

Beitrag 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
Prozessor: Intel(R) Core(TM)2 Duo CPU mit je 2 GHz
4GB RAM
Grafikkarte: ATI Mobility Radeon HD 2400
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: AddKeyboardShortcut()

Beitrag 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
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: AddKeyboardShortcut()

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Ostblock_D
Beiträge: 7
Registriert: 06.07.2010 10:45

Re: AddKeyboardShortcut()

Beitrag 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
Prozessor: Intel(R) Core(TM)2 Duo CPU mit je 2 GHz
4GB RAM
Grafikkarte: ATI Mobility Radeon HD 2400
Ostblock_D
Beiträge: 7
Registriert: 06.07.2010 10:45

Re: AddKeyboardShortcut()

Beitrag von Ostblock_D »

habs schon

Code: Alles auswählen

Repeat
    Event = WindowEvent ()
...
Until()
statt WaitWindowEvent() nehmen ... sonst wartet das Program jedesmal auf ein Event
Prozessor: Intel(R) Core(TM)2 Duo CPU mit je 2 GHz
4GB RAM
Grafikkarte: ATI Mobility Radeon HD 2400
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: AddKeyboardShortcut()

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Ostblock_D
Beiträge: 7
Registriert: 06.07.2010 10:45

Re: AddKeyboardShortcut()

Beitrag 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
Prozessor: Intel(R) Core(TM)2 Duo CPU mit je 2 GHz
4GB RAM
Grafikkarte: ATI Mobility Radeon HD 2400
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: AddKeyboardShortcut()

Beitrag 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 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten