Seite 1 von 3

Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 04.08.2012 11:38
von Falko
Ich wollte diesen Code ins BUG-forum schreiben,
da ich aber nicht weiß, warum es so ist, poste ich den mal hier rein.
Zuvor will ich noch sagen, das das Problem bei 4.60 nicht ist.

Bitte startet mal folgenden Code, verkleinert das Fenster so,
das der Desktop zu sehen ist und wechselt mal mit Mausklick
im leeren Desktopfeld und dann wieder im Windows auf einer der Stringgadgets.
Danach klickt mal eine der Steuerungstasten wie shift. Das gesamte Windows flackert, also
macht ein Repaint, was irgendwie stört. Wechselt man nur zwischen Desktop und Programm,
ist das nur beim ersten Mal. Danach kann man es so oft machen wie man will, dann wird nichts
neu gezeichnet. Nur wenn man danach nur die Shifttaste drückt wird "immer wieder" neu gezeichnet.
Bei der PB-Version 4.60 passiert dieser Effekt überhaupt nicht. Weiß einer warum es ab PB 4.61 so ist?


Hier erstmal der Testcode.

Code: Alles auswählen

; weil ich es inzwischen so gewohnt bin, Variablendefinitionen "Ein"
EnableExplicit
Define quit.i
Define eventid.i
Define a.i

; Also folgendes passiert:
; wenn du das Fenster verläßt, z.B. in das Debuggerfenster klickts und
; dann NUR den Cursor in eines der String-Gadget legst und DANN die
; Shift-Taste drückst, dann flackert es wie die Sau unter 4.61.
; Dann rennen die repaints auch nur so durch das Debugger-Fenster
; Mit 4.60 kein Problem


; Fenster, der Gleichheit halber so wie in den Programmen bei mir üblich, zunächst Invisible
OpenWindow      (0,  0,  0,100, 20,"Testfenster",  #PB_Window_SizeGadget|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_Maximize|#PB_Window_Invisible)
; Hintergrundfarbe
SetWindowColor  (0, RGB(100,100,100))
WindowBounds    (0, 800, 600, #PB_Ignore, #PB_Ignore) 
; Menu
CreateMenu      (0, WindowID(0))
MenuTitle       ("Datei")
; Gadget alle auf Scroll-Area
ScrollAreaGadget(0,  0,  0,WindowWidth(0), WindowHeight(0) - MenuHeight(),1580, 810, 20)
    PanelGadget              ( 6,  0,  0,1580,810)
      AddGadgetItem          ( 6, -1, "Eingaben")
        ; Container Zeile hinzufügen
        ContainerGadget      ( 7,  0,  0,500,690, #PB_Container_Flat)
          StringGadget       ( 1, 10, 10,200, 20,"")
          StringGadget       ( 2, 10, 40,200, 20,"")
          StringGadget       ( 3, 10, 70,200, 20,"")
          StringGadget       ( 4, 10,100,200, 20,"")
          StringGadget       ( 5, 10,130,200, 20,"")
          ListIconGadget     ( 8, 10,160,480,200,"blub",100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
          AddGadgetColumn    ( 8, 1,"blub", 80)
          AddGadgetColumn    ( 8, 2,"blub", 80)
          AddGadgetColumn    ( 8, 3,"blub", 80)
          ListIconGadget     ( 9, 10,370,480,200,"blub",100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
          AddGadgetColumn    ( 9, 1,"blub", 80)
          AddGadgetColumn    ( 9, 2,"blub", 80)
          AddGadgetColumn    ( 9, 3,"blub", 80)
          For a = 0 To 100
            AddGadgetItem    ( 8, -1, "Zeile" + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0"))
            AddGadgetItem    ( 9, -1, "Zeile" + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0"))
          Next a
        CloseGadgetList()
        ; Container Zeile hinzufügen
        ContainerGadget      (10,510,  0,500,690, #PB_Container_Flat)
          StringGadget       (11, 10, 10,200, 20,"")
          StringGadget       (12, 10, 40,200, 20,"")
          StringGadget       (13, 10, 70,200, 20,"")
          StringGadget       (14, 10,100,200, 20,"")
          StringGadget       (15, 10,130,200, 20,"")
          ListIconGadget     (16, 10,160,480,200,"blub",100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
          AddGadgetColumn    (16, 1,"blub", 80)
          AddGadgetColumn    (16, 2,"blub", 80)
          AddGadgetColumn    (16, 3,"blub", 80)
          ListIconGadget     (17, 10,370,480,200,"blub",100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
          AddGadgetColumn    (17, 1,"blub", 80)
          AddGadgetColumn    (17, 2,"blub", 80)
          AddGadgetColumn    (17, 3,"blub", 80)
          For a = 0 To 100
            AddGadgetItem    (16, -1, "Zeile" + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0"))
            AddGadgetItem    (17, -1, "Zeile" + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0") + Chr(10) + RSet(Str(a), 4, "0"))
          Next a
        CloseGadgetList()
      AddGadgetItem          (6, -1, "Ausgaben")
    CloseGadgetList()
CloseGadgetList ()
; anzeigen wenn alles aufgebaut ist
HideWindow      (0, 0)
; Schleife
;SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE) | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS)
Repeat
  EventID=WaitWindowEvent()
  ;...
Until EventID=#PB_Event_CloseWindow

; Ende
End
Gruß,
Falko

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 16:30
von hjbremer
Ich kann dies nur bestätigen
z.B. Fenster mit Listicongadget und öffnen eines Messagerequester führt ebenfalls zum Neuzeichnen des Listicongadgets

Habe mir extra die 4.60 Version geladen, da ist es nicht !!!!!!

erst ab 4.61 und auch 4.70 b1

in den meisten Fällen stört es nicht sehr, aber ich kann mir durchaus vorstellen das es manche nervt.
Dann bleibt nur noch 4.60 benutzen

hier ein Testcode

Code: Alles auswählen

Enumeration
 #win1 
 #but1
 #but2
 #lvg1
EndEnumeration

OpenWindow(#win1, 0, 0, 600, 480, "ListIcon Gadget")
  
  ButtonGadget(#but1,  10, 440, 100, 22, "xxx")
  
   
  lvflags = #PB_ListIcon_FullRowSelect
  lvflags | #PB_ListIcon_CheckBoxes 
  lvflags | #PB_ListIcon_MultiSelect
  lvflags | #PB_ListIcon_GridLines
  
  ListIconGadget(#lvg1, 10, 10, 380, 400, "Sp 0", 240, lvflags)
  
   AddGadgetColumn(#lvg1, 1, "Sp 1", 50)    
   AddGadgetColumn(#lvg1, 2, "Sp 2", 190) 
  
  For i = 0 To 36 
    nr$ = LSet(Str(i), 3) 
    tt$ = "Text in Zeile " + nr$ + " in Spalte 0" 
    tt$ + #LF$ + Str(Random(111)) + #LF$ + "Hallo"
    AddGadgetItem(#lvg1, -1, tt$)               
  Next 
  
Repeat: event = WaitWindowEvent() 

   If event = #PB_Event_Gadget
      Select EventGadget()
         Case #but1
            MessageRequester("xxx", "YYYYYY") 
         
      EndSelect     
   EndIf 

Until event = #PB_Event_CloseWindow 

End 

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 16:36
von ts-soft
Dann bin ich wohl doch Blind, kann das Problem nicht sehen, hab jetzt alles ausprobiert.

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 16:44
von Falko
Bei dem letzten Beispiel wenn man links den Button
XXX anklickt, kommt eine Messagebox und wenn man nun zwischen
beiden hin und her klickt, also jeweils das Windows und die Messagebox abwechselnd klickt flackert die Messagebox mehrfach auf.

Bei dem obigen Beispiel reagiert beim Wechsel zwischen einmal Klick auf dem Desktop und dann wieder im Fenster einmal ein kurze Flackern für den Aufbau
des Windows, aber wenn man dann nochmal die Shifttaste drückt, kommt wieder
ein Flackern. Schließlich braucht man die Shifttasste für Großschrift in den Stringgadgets.



Gruß,
Falko

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 16:46
von NicTheQuick
Unter Linux gibt es keine Flackerprobleme, dafür sieht das Fenster nach dem Öffnen aber so aus: Klick mich

Achja, und das Menü öffnet sich auch nicht. /:->

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 17:03
von ts-soft
Falko hat geschrieben:Bei dem letzten Beispiel wenn man links den Button
XXX anklickt, kommt eine Messagebox und wenn man nun zwischen
beiden hin und her klickt, also jeweils das Windows und die Messagebox abwechselnd klickt flackert die Messagebox mehrfach auf.
Das ist ja auch normal bei Modalen Dialogfenstern :lol:
Was hat das mit PB zu tun. Passiert auch mit älteren Version.

Und passiert auch per API:

Code: Alles auswählen

 Enumeration
 #win1
 #but1
 #but2
 #lvg1
EndEnumeration

OpenWindow(#win1, 0, 0, 600, 480, "ListIcon Gadget")
 
  ButtonGadget(#but1,  10, 440, 100, 22, "xxx")
 
   
  lvflags = #PB_ListIcon_FullRowSelect
  lvflags | #PB_ListIcon_CheckBoxes
  lvflags | #PB_ListIcon_MultiSelect
  lvflags | #PB_ListIcon_GridLines
 
  ListIconGadget(#lvg1, 10, 10, 380, 400, "Sp 0", 240, lvflags)
 
   AddGadgetColumn(#lvg1, 1, "Sp 1", 50)   
   AddGadgetColumn(#lvg1, 2, "Sp 2", 190)
 
  For i = 0 To 36
    nr$ = LSet(Str(i), 3)
    tt$ = "Text in Zeile " + nr$ + " in Spalte 0"
    tt$ + #LF$ + Str(Random(111)) + #LF$ + "Hallo"
    AddGadgetItem(#lvg1, -1, tt$)               
  Next
 
Repeat: event = WaitWindowEvent()

   If event = #PB_Event_Gadget
      Select EventGadget()
         Case #but1
            ;MessageRequester("xxx", "YYYYYY")
            MessageBox_(WindowID(#win1), @"xxx", @"YYYYYY", 0)
         
      EndSelect     
   EndIf

Until event = #PB_Event_CloseWindow

End
Weil es eben normales Verhalten ist, oder ich übersehe immer noch etwas?

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 17:12
von Falko
Ok, das meinte ich nicht. Aber ist das deiner Meinung nach auch im ersten Beispiel bei allen PB-Versionen gleich? /:->

Bei 4.6 kommt bei der Shifttaste nach Wechsel zwischen Desktop und einem Stringgadget kein kurzes Flackern. Ab Version 4.61 und 4.7 schon.
Vielleicht ist dein Rechner auch schneller als meiner, das du das nicht
siehst :lol:

Gruß,
Falko

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 17:15
von DarkDragon
Am Repaint-Event wurde tatsächlich etwas verändert:
http://www.purebasic.fr/english/viewtop ... 96#p386596

@ts-soft: das ListIconGadget scheint bei hjbremer zu flackern, nicht die MessageBox.

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 17:16
von ts-soft
Okay, zur MessageBox. In früheren Versionen hat PB das hWnd nicht übergeben, sondern einfach nur 0. Das war verkehrt und ist
jetzt richtig, zumindest unter Windows. Man kann aber die API nutzen und statt hWnd einfach 0 angeben, dann hat man das
alte, aber falsche Verhalten wieder :mrgreen:

Das Flackern mit Shift hab ich jetzt auch gesehen, das ist wirklich merkwürdig und sollte man vielleicht mal im engl. Forum melden.
Aber das Beispielfenster besser verkleinern, nicht das man erst umschalten muß.

Re: Repaint (Flackern) bei Shift, ist das normal?

Verfasst: 05.08.2012 17:18
von ts-soft
DarkDragon hat geschrieben:@ts-soft: das ListIconGadget scheint bei hjbremer zu flackern, nicht die MessageBox.
Bei mir flackert nur die MessageBox, vielleicht gibt er noch alle CompilerOptionen an, damit man das nachvollziehen kann.