Probleme beim Redraw mit ImageGadget und Fensterhintergrund

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Probleme beim Redraw mit ImageGadget und Fensterhintergrund

Beitrag von stbi »

Moin! Ich habe folgendes Problem:

Ich habe ein Fenster mit weißem Hintergrund. Darauf zappeln ein paar ImageGadget herum. Wird das Fenster vergrößert oder verkleinert, werden diese ImageGadgets vom Programm hinsichtlich Größe und Position angepasst. Nur je nachdem wie hektisch ich das Fenster ziehe, bleiben irgendwelche Artefakte zurück, d.h. der Fensterhintergrund wird nicht sauber neu gezeichnet.
Ich mache jetzt schon zwei Tage dran rum, habe alle möglichen Sachen ausprobiert, aber ich komme einfach nicht weiter. Ich habe mal ein einfaches Beispiel zum rumprobieren zusammengecodet, baut 6 ImageGadgets auf, deren Bilder alle Sekunde getauscht werden oder auch nicht. Kann sich das bitte mal jemand anschauen? Hinweis: anstelle meiner JPGs einfach irgendwelche JPGs nehmen, werden automatisch skaliert.
Danke!

Code: Alles auswählen

; ImageGadget/Resize-Test

#init_window_xsize = 390
#init_window_ysize = 175


Global window_xsize.l, old_x.l
Global window_ysize.l, old_y.l
Global icon_xsize.l
Global icon_space.l
Global icon_ysize.l

Dim xpos.l(7)
Global ypos.l


UseJPEGImageDecoder()

Global Image0
Global Image1
Image0 = CatchImage(1, ?Image0)
Image1 = CatchImage(2, ?Image1)

DataSection
Image0:
  IncludeBinary "eins.jpg"
Image1:
  IncludeBinary "zwei.jpg"
EndDataSection


Procedure sizing()

  icon_xsize = window_xsize/7.5

  icon_space = icon_xsize/2

  icon_ysize = (window_ysize - 2.5*icon_space)/4

  xpos(1) = icon_space/2
  xpos(2) = xpos(1) + icon_xsize
  xpos(3) = xpos(2) + icon_xsize + icon_space
  xpos(4) = xpos(3) + icon_xsize
  xpos(5) = xpos(4) + icon_xsize + icon_space
  xpos(6) = xpos(5) + icon_xsize

  ypos = icon_space/2

;  Image0 = CatchImage(1, ?Image0)
  Image0 = ResizeImage(1, icon_xsize, icon_ysize)
;  Image1 = CatchImage(2, ?Image1)
  Image1 = ResizeImage(2, icon_xsize, icon_ysize)

  StartDrawing(WindowOutput())
  Box(0, 0, window_xsize, window_ysize ,RGB(255,255,255))
  StopDrawing()

  For x = 1 To 6
    ResizeGadget(10+x, xpos(x), ypos, icon_xsize, icon_ysize)
  Next
 
EndProcedure


Procedure DrawBit( pos.b )

  If Random(1) = 1
    SetGadgetState(10 + pos, Image1)
  Else
    SetGadgetState(10 + pos, Image0)
  EndIf

EndProcedure


Procedure DrawImages()

  window_xsize = WindowWidth()
  window_ysize = WindowHeight()

  If window_xsize <> old_x Or window_ysize <> old_y

    sizing()

    old_x = window_xsize
    old_y = window_ysize
    
  EndIf

  For x = 1 To 6
    DrawBit( x )
  Next
  
EndProcedure


Procedure Open_Window()

  If OpenWindow(1, 275, 189, window_xsize, window_ysize,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test")
  
    If CreateGadgetList(WindowID())

      For x = 1 To 6
         ImageGadget(10+x, 0, 0, 0, 0, Image0)
      Next
      
    EndIf
    
    StartDrawing(WindowOutput())
    Box(0, 0, window_xsize, window_ysize ,RGB(255,255,255))
    StopDrawing()
    
  EndIf
  
EndProcedure


; Start Main
window_xsize = #init_window_xsize
window_ysize = #init_window_ysize
old_x = 0
old_y = 0


Open_Window()

sizing()

StartTimer(0, 1000, @DrawImages() )

Repeat
  
  Event = WaitWindowEvent()
  
Debug event
  
  
Until Event = #PB_EventCloseWindow

End
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

Hilfe! Bitte guckt es Euch doch mal an bzw. bestätigt mir bitte, ob Ihr das selbe Phänomen mit meinem Code bekommt wie ich. Danke!
Oder ist mein Code so mies? :oops:
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag von Mischa »

Code: Alles auswählen

#init_window_xsize = 390 
#init_window_ysize = 175 


Global window_xsize.l, old_x.l 
Global window_ysize.l, old_y.l 
Global icon_xsize.l 
Global icon_space.l 
Global icon_ysize.l 
Global brush

Dim xpos.l(7) 
Global ypos.l 


UseJPEGImageDecoder() 

Global Image0 
Global Image1 
Image0 = CatchImage(1, ?Image0) 
Image1 = CatchImage(2, ?Image1) 

DataSection 
Image0: 
  IncludeBinary "eins.jpg" 
Image1: 
  IncludeBinary "zwei.jpg" 
EndDataSection 


Procedure sizing() 

  icon_xsize = window_xsize/7.5 

  icon_space = icon_xsize/2 

  icon_ysize = (window_ysize - 2.5*icon_space)/4 

  xpos(1) = icon_space/2 
  xpos(2) = xpos(1) + icon_xsize 
  xpos(3) = xpos(2) + icon_xsize + icon_space 
  xpos(4) = xpos(3) + icon_xsize 
  xpos(5) = xpos(4) + icon_xsize + icon_space 
  xpos(6) = xpos(5) + icon_xsize 

  ypos = icon_space/2 
  
  ;Sonst wirds schwarz bei zu kleinem Fenster. ;)
  If icon_xsize<10:icon_xsize=10:EndIf
  If icon_ysize<10:icon_ysize=10:EndIf

;  Image0 = CatchImage(1, ?Image0) 
  Image0 = ResizeImage(1, icon_xsize, icon_ysize) 
;  Image1 = CatchImage(2, ?Image1) 
  Image1 = ResizeImage(2, icon_xsize, icon_ysize) 


  For x = 1 To 6 
    ResizeGadget(10+x, xpos(x), ypos, icon_xsize, icon_ysize) 
  Next 
  
EndProcedure 


Procedure DrawBit( pos.b ) 

  If Random(1) = 1 
    SetGadgetState(10 + pos, Image1) 
  Else 
    SetGadgetState(10 + pos, Image0) 
  EndIf 

EndProcedure 


Procedure DrawImages() 

  window_xsize = WindowWidth() 
  window_ysize = WindowHeight() 

  If window_xsize <> old_x Or window_ysize <> old_y 

    sizing() 

    old_x = window_xsize 
    old_y = window_ysize 
    
  EndIf 

  For x = 1 To 6 
    DrawBit( x ) 
  Next 
  
EndProcedure 


Procedure Open_Window() 

  If OpenWindow(1, 275, 189, window_xsize, window_ysize,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test") 
    brush=CreateSolidBrush_(RGB(255,255,255)) 
    SetClassLong_(WindowID(),#GCL_HBRBACKGROUND,brush)
    If CreateGadgetList(WindowID()) 

      For x = 1 To 6 
         ImageGadget(10+x, 0, 0, 0, 0, Image0) 
      Next 
      
    EndIf 

    
  EndIf 
  
EndProcedure 


; Start Main 
window_xsize = #init_window_xsize 
window_ysize = #init_window_ysize 
old_x = 0 
old_y = 0 


Open_Window() 

sizing() 

StartTimer(0, 100, @DrawImages() ) 

Repeat 
  
  Event = WaitWindowEvent() 
  
Debug event 
  
  
Until Event = #PB_EventCloseWindow 

DeleteObject_(brush)
End 
Ist natürlich keine Art, wie verrückt immer wieder die Images zu
'resizen'. Machst Du von Quellbild zu Zielbild um die Qualität zu
erhalten. Aber is ja nur ein Bastel-Code, nicht wahr?

Gruß,
Mischa
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

Mischa hat geschrieben:Ist natürlich keine Art, wie verrückt immer wieder die Images zu
'resizen'. Machst Du von Quellbild zu Zielbild um die Qualität zu
erhalten. Aber is ja nur ein Bastel-Code, nicht wahr?
erstmal ein dickes Danke für die Art, den Fensterhintergrund zu setzen, danach habe ich gesucht und gesucht ... :praise:

und danke für den Hinweis, die Größe der Icons auf ein Minimum zu beschränken, das macht Sinn

Das Resizing passiert ja maximal einmal pro Sekunde, und auch nur wenn gerade die Fenstergröße geändert wird, von daher halte ich den Aufwand für akzeptabel, mir ist aber auch nichts besseres eingefallen. Und vor allem wegen der Qualität muss ich gerade beim Vergrößern immer wieder auch vom Originalbild ausgehen.

Die Bemerkung mit dem Bastelcode habe ich bestimmt verdient :oops: der Code war eigentlich auch nur zur Problemeingrenzung. Im fertigen Programm würde ich den Code aber im wesentlichen wiederverwenden. Was könnte ich denn besser oder eleganter machen?

Danke nochmal!
Gruß Stefan
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Antworten