ScrollBarGadget, Änderungen sofort anzeigen???

Anfängerfragen zum Programmieren mit PureBasic.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

ScrollBarGadget, Änderungen sofort anzeigen???

Beitrag von JayCool »

Hallihallo,

ich hab' mal wieder eine Frage, und zwar dreht sie sich heute um die Reaktion des ScrollBarGadgets. Ich habe dazu mal das beiliegende Beispiel vorbereitet.

Code: Alles auswählen


OpenWindow(0,0,0,200,200,"<--o--o-->",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_Maximize|#PB_Window_SizeGadget)

CreateImage(1,640,480)

CreateGadgetList(WindowID(0))
  ImageGadget(0,100,100,ImageWidth(1),ImageHeight(1),ImageID(1),#PB_Image_Border)
  ScrollBarGadget(1,20,20,WindowWidth(0)-40,20,1,239,1)
  
ImageOutput(1)

Procedure Zeichnen(Amplitude) 

  StartDrawing(ImageOutput(1))
  
  Box(0,0,639,479,$000000)
  
  For x = 0 To 639
    y = 240 - Amplitude * Sin(2 * 3.14159265 / 639 * x)
    
      Plot(x,y,$FFFFFF)
      Plot(x,240,$FFFFFF)
    
  Next x

  StopDrawing()

  SetGadgetState(0,ImageID(1))

EndProcedure

Zeichnen(100)
SetGadgetState(1,100)

Repeat
  event = WindowEvent()
  
  Zeichnen(GetGadgetState(1))
  
  If event = #PB_Event_Gadget
    
    If EventGadget() = 1
      Zeichnen(GetGadgetState(1))
    EndIf
  
  EndIf
     
Until event = #PB_Event_CloseWindow

End


Wenn man hier den Rollbalken verschiebt, verändert sich entsprechend die Amplitude der angezeigten Sinuslinie.

Was mir aber an der Geschichte noch nicht so ganz gefällt, ist die Tatsache, dass sich Änderungen erst ergeben, sobald man die linke Maustaste über dem Gadget wieder losgelassen hat.

Ist es denn nicht mit einfachen Mitteln möglich, eine Änderung anzuzeigen, auch wenn der Balken noch geschoben wird???

Wenn man bei M$-Word den vertikalen Rollbalken in einem längeren Text verschiebt, dann kriegt man ja auch sofort den neuen Textausschnitt angezeigt, und nicht erst, wenn man die Maustaste über dem Rollbalken wieder loslässt.

Gruß, Jan
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Da mit PB intern schon alles fertig ist, bevor du ueberhaupt mit bekommst
das etwas passiert bzw du ein Event bekommst, musst du ein Callback
setzen und das Event dort abfangen.

Code: Alles auswählen

Procedure Zeichnen(Amplitude) 

  StartDrawing(ImageOutput(1)) 
  
  Box(0,0,639,479,$000000) 
  
  For x = 0 To 639 
    y = 240 - Amplitude * Sin(2 * 3.14159265 / 639 * x) 
    
      Plot(x,y,$FFFFFF) 
      Plot(x,240,$FFFFFF) 
    
  Next x 

  StopDrawing() 

  SetGadgetState(0,ImageID(1)) 

EndProcedure 

Procedure Callback(hwnd,msg,wparam,lparam)
    
  If msg = #WM_HSCROLL And lparam = GadgetID(1)
    Zeichnen(GetGadgetState(1)) 
  EndIf 
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


OpenWindow(0,0,0,640,530,"<--o--o-->",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget) 

SetWindowCallback(@Callback())

CreateImage(1,640,480) 

CreateGadgetList(WindowID(0)) 
  ImageGadget(0,0,50,ImageWidth(1),ImageHeight(1),ImageID(1),#PB_Image_Border) 
  ScrollBarGadget(1,20,20,200,20,1,239,1)   
  
  SetGadgetState(1,100) 
  Zeichnen(100)  


Repeat 
  event = WindowEvent()     
Until event = #PB_Event_CloseWindow 
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

Hi Edel,

vielen Dank erstmal! Das ist genau das, was ich gesucht habe!
Antworten