Textgadget resize - Text falsch dargestellt (kein Bug)

Fragen und Bugreports zur PureBasic 4.0-Beta.
mar
Beiträge: 107
Registriert: 06.08.2005 14:49

Textgadget resize - Text falsch dargestellt (kein Bug)

Beitrag von mar »

Hi hier mal etwas Code zum Resizen. Ab und zu
fehlt etwas Text im Textgadget. zB. "GUI-" von GUI-Abschnitt.

habe auch zwei Snapshots davon für alle Fälle.

Code: Alles auswählen

 #Window=0
 #Rand=5
 #HeightStart=195
 #WidhtStart=230
 #TextGadgetHight = 25
 If OpenWindow(#Window, 0, 0,#WidhtStart, #HeightStart, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
    If CreateGadgetList(WindowID(#Window))
      
      #Button1  = 0 
      #Button2  = 1
      #Button3  = 2
      #Button4  = 3
      #Splitter1 = 10
      #Splitter2 = 11
      #Splitter3 = 12
      
      #TextGadget = 20
      
      ButtonGadget(#Button1,0, 0, 0, 0, "Button 1") ; es besteht keine Notwendigkeit, die Größe oder Position
      ButtonGadget(#Button2,0, 0, 0, 0, "Button 2") ; festzulegen, da sie automatisch in der Größe angepasst werden
      SplitterGadget(#Splitter1, 0, 0, 0, 0, #Button1, #Button2, #PB_Splitter_Separator)

      ButtonGadget(#Button3,0, 0, 0, 0, "Button 3") ; es besteht keine Notwendigkeit, die Größe oder Position
      ButtonGadget(#Button4,0, 0, 0, 0, "Button 4") ; festzulegen, da sie automatisch in der Größe angepasst werden
      SplitterGadget(#Splitter2, 0, 0, 0, 0, #Button3, #Button4, #PB_Splitter_Separator)

      SplitterGadget(#Splitter3, #Rand, #Rand, #WidhtStart-2*#Rand, #HeightStart-2*#Rand, #Splitter1, #Splitter2, #PB_Splitter_Vertical|#PB_Splitter_Separator)
      
      TextGadget(#TextGadget, #Rand, 135, #WidhtStart-2*#Rand, #TextGadgetHight-2*#Rand, "Obiger GUI-Abschnitt zeigt vier sich automatisch in der Größe anpassende Schalter. Auch beim Resize vom gesamten Window passen sich alle Gadgets an.",#PB_Text_Center )
      
      Repeat 
        event=WaitWindowEvent() 
        
          ResizeGadget(#Splitter3,#PB_Ignore, #PB_Ignore , WindowWidth(#Window)-2*#Rand, WindowHeight(#Window)-#TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
          ResizeGadget(#TextGadget,#PB_Ignore, WindowHeight(#Window)-#TextGadgetHight+#Rand , WindowWidth(#Window)-2*#Rand, #TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
      
      Until event = #PB_Event_CloseWindow
      
    EndIf
  EndIf
[/img]
Zuletzt geändert von mar am 28.05.2006 11:28, insgesamt 1-mal geändert.
mar
Beiträge: 107
Registriert: 06.08.2005 14:49

Beitrag von mar »

wenn man nur die Breite des Fensters ändert bleibt der Fehler erhalten.
Aber wenn man das Fenster mal minimiert und dann wieder normal
auf den Bildschirm holt wird es wieder richtig dargestellt.

Irgendwie als ob das Programm beim Schreiben des Textes in den "Imagespeicher"
manchmal unterbrochen wird. Aber das ist nur eine Vermutung.
Man könnte nach einem Resize ja auch zur Not einen Fensterrefresh aufrufen
- nur um sicherzugehen.

mar
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

yepp, tritt auch hier auf.

Kleiner Workaround:

Code: Alles auswählen

SetGadgetText(#TextGadget, GetGadgetText(#TextGadget))
Ist zwar nicht sehr elegant, aber effektiv ;-)

Grüße ... Kiffi

P.S.: ResizeGadget() solltest Du nur dann aufrufen, wenn auch wirklich ein
#PB_Event_SizeWindow aufgetreten ist.

P.P.S.: Width, nicht Widht ;-)

Code: Alles auswählen

 #Window=0
 #Rand=5
 #HeightStart=195
 #WidthStart=230
 #TextGadgetHight = 25
 If OpenWindow(#Window, 0, 0,#WidthStart, #HeightStart, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
  If CreateGadgetList(WindowID(#Window))
    
    #Button1  = 0
    #Button2  = 1
    #Button3  = 2
    #Button4  = 3
    #Splitter1 = 10
    #Splitter2 = 11
    #Splitter3 = 12
    
    #TextGadget = 20
    
    ButtonGadget(#Button1,0, 0, 0, 0, "Button 1") ; es besteht keine Notwendigkeit, die Größe oder Position
    ButtonGadget(#Button2,0, 0, 0, 0, "Button 2") ; festzulegen, da sie automatisch in der Größe angepasst werden
    SplitterGadget(#Splitter1, 0, 0, 0, 0, #Button1, #Button2, #PB_Splitter_Separator)
    
    ButtonGadget(#Button3,0, 0, 0, 0, "Button 3") ; es besteht keine Notwendigkeit, die Größe oder Position
    ButtonGadget(#Button4,0, 0, 0, 0, "Button 4") ; festzulegen, da sie automatisch in der Größe angepasst werden
    SplitterGadget(#Splitter2, 0, 0, 0, 0, #Button3, #Button4, #PB_Splitter_Separator)
    
    SplitterGadget(#Splitter3, #Rand, #Rand, #WidthStart-2*#Rand, #HeightStart-2*#Rand, #Splitter1, #Splitter2, #PB_Splitter_Vertical|#PB_Splitter_Separator)
    
    TextGadget(#TextGadget, #Rand, 135, #WidthStart-2*#Rand, #TextGadgetHight-2*#Rand, "Obiger GUI-Abschnitt zeigt vier sich automatisch in der Größe anpassende Schalter. Auch beim Resize vom gesamten Window passen sich alle Gadgets an.",#PB_Text_Center )
    
    Repeat
      event=WaitWindowEvent()
      
      Select event
        
        Case #PB_Event_SizeWindow
          ResizeGadget(#Splitter3,#PB_Ignore, #PB_Ignore , WindowWidth(#Window)-2*#Rand, WindowHeight(#Window)-#TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
          ResizeGadget(#TextGadget,#PB_Ignore, WindowHeight(#Window)-#TextGadgetHight+#Rand , WindowWidth(#Window)-2*#Rand, #TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
          SetGadgetText(#TextGadget, GetGadgetText(#TextGadget))
          
      EndSelect
      
    Until event = #PB_Event_CloseWindow
    
  EndIf
EndIf
mar
Beiträge: 107
Registriert: 06.08.2005 14:49

Beitrag von mar »

@kiffi danke - na vielleicht lern ich's ja noch mit dem Inglish <)
mar
Beiträge: 107
Registriert: 06.08.2005 14:49

Beitrag von mar »

Habe das von Kiffi in die #PB_Event_Repaint Routine gepackt.
+einen kleinen Schönheitsfehler beseitigt+width korrigiert.
Jetzt gehts auch.

Code: Alles auswählen

 #Window=0
 #Rand=5
 #HeightStart=195
 #WidthStart=230
 #TextGadgetHight = 25
 If OpenWindow(#Window, 0, 0,#WidthStart, #HeightStart, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
    If CreateGadgetList(WindowID(#Window))
      
      #Button1  = 0 
      #Button2  = 1
      #Button3  = 2
      #Button4  = 3
      #Splitter1 = 10
      #Splitter2 = 11
      #Splitter3 = 12
      
      #TextGadget = 20
      
      ButtonGadget(#Button1,0, 0, 0, 0, "Button 1") ; es besteht keine Notwendigkeit, die Größe oder Position
      ButtonGadget(#Button2,0, 0, 0, 0, "Button 2") ; festzulegen, da sie automatisch in der Größe angepasst werden
      SplitterGadget(#Splitter1, 0, 0, 0, 0, #Button1, #Button2, #PB_Splitter_Separator)

      ButtonGadget(#Button3,0, 0, 0, 0, "Button 3") ; es besteht keine Notwendigkeit, die Größe oder Position
      ButtonGadget(#Button4,0, 0, 0, 0, "Button 4") ; festzulegen, da sie automatisch in der Größe angepasst werden
      SplitterGadget(#Splitter2, 0, 0, 0, 0, #Button3, #Button4, #PB_Splitter_Separator)

      SplitterGadget(#Splitter3, #Rand, #Rand, #WidthStart-2*#Rand, #HeightStart-2*#Rand, #Splitter1, #Splitter2, #PB_Splitter_Vertical|#PB_Splitter_Separator)
      
      TextGadget(#TextGadget, #Rand, WindowHeight(#Window)-#TextGadgetHight+#Rand, #WidthStart-2*#Rand, #TextGadgetHight-2*#Rand, "Obiger GUI-Abschnitt zeigt vier sich automatisch in der Größe anpassende Schalter. Auch beim Resize vom gesamten Window passen sich alle Gadgets an.",#PB_Text_Center )
      
      Repeat 
        event=WaitWindowEvent() 
        
        If event=#PB_Event_SizeWindow
        
          ResizeGadget(#Splitter3,#PB_Ignore, #PB_Ignore , WindowWidth(#Window)-2*#Rand, WindowHeight(#Window)-#TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
          ResizeGadget(#TextGadget,#PB_Ignore, WindowHeight(#Window)-#TextGadgetHight+#Rand , WindowWidth(#Window)-2*#Rand, #TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
        ElseIf event=#PB_Event_Repaint
          SetGadgetText(#TextGadget, GetGadgetText(#TextGadget))
        EndIf
        
      Until event = #PB_Event_CloseWindow
      
    EndIf
  EndIf
mar
Beiträge: 107
Registriert: 06.08.2005 14:49

Beitrag von mar »

na ja nur das dieses #PB_Event_Repaint so oft
auftritt, dass der Text jetzt beim Resizen flackert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

 #Window=0
 #Rand=5
 #HeightStart=195
 #WidthStart=230
 #TextGadgetHight = 25
 If OpenWindow(#Window, 0, 0,#WidthStart, #HeightStart, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
  If CreateGadgetList(WindowID(#Window))
    
    #Button1  = 0
    #Button2  = 1
    #Button3  = 2
    #Button4  = 3
    #Splitter1 = 10
    #Splitter2 = 11
    #Splitter3 = 12
    
    #TextGadget = 20
    
    ButtonGadget(#Button1,0, 0, 0, 0, "Button 1") ; es besteht keine Notwendigkeit, die Größe oder Position
    ButtonGadget(#Button2,0, 0, 0, 0, "Button 2") ; festzulegen, da sie automatisch in der Größe angepasst werden
    SplitterGadget(#Splitter1, 0, 0, 0, 0, #Button1, #Button2, #PB_Splitter_Separator)
    
    ButtonGadget(#Button3,0, 0, 0, 0, "Button 3") ; es besteht keine Notwendigkeit, die Größe oder Position
    ButtonGadget(#Button4,0, 0, 0, 0, "Button 4") ; festzulegen, da sie automatisch in der Größe angepasst werden
    SplitterGadget(#Splitter2, 0, 0, 0, 0, #Button3, #Button4, #PB_Splitter_Separator)
    
    SplitterGadget(#Splitter3, #Rand, #Rand, #WidthStart-2*#Rand, #HeightStart-2*#Rand, #Splitter1, #Splitter2, #PB_Splitter_Vertical|#PB_Splitter_Separator)
    
    TextGadget(#TextGadget, #Rand, 135, #WidthStart-2*#Rand, #TextGadgetHight-2*#Rand, "Obiger GUI-Abschnitt zeigt vier sich automatisch in der Größe anpassende Schalter. Auch beim Resize vom gesamten Window passen sich alle Gadgets an.",#PB_Text_Center|#SS_SIMPLE)
    
    Repeat
      event=WaitWindowEvent()
      
      Select event 
        Case #PB_Event_SizeWindow
          ResizeGadget(#Splitter3,#PB_Ignore, #PB_Ignore , WindowWidth(#Window)-2*#Rand, WindowHeight(#Window)-#TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.
          ResizeGadget(#TextGadget,#PB_Ignore, WindowHeight(#Window)-#TextGadgetHight+#Rand , WindowWidth(#Window)-2*#Rand, #TextGadgetHight-2*#Rand) ; Ändert nur die Gadgetbreite.  
      EndSelect
      
    Until event = #PB_Event_CloseWindow
    
  EndIf
EndIf
mar
Beiträge: 107
Registriert: 06.08.2005 14:49

Beitrag von mar »

Ah der Fehler war bei meiner Eventschleife. Ich hatte bei jedem
Event ResizeGadget aufgerufen. Dabei ist PureBasic wohl
etwas überlastet gewesen. :lol:
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Du brauchst doch nur #SS_SIMPLE setzen . Das sollte das Problem beheben.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

hallodri hat geschrieben:Du brauchst doch nur #SS_SIMPLE setzen . Das sollte das Problem beheben.
Ähhm, .... sorry ... kurze dumme Frage:

Was genau macht #SS_SIMPLE und wo hast Du solche Infos dazu her dass es da eingesetzt werden kann (ist ja wohl keine #PB-Konstante)? :shock:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Gesperrt