Page 1 sur 1
ScrollAreaGadget, contenaire pas bien !
Publié : sam. 14/mai/2005 16:13
par Gratteur
Il y a un énorme bug de rafraîchissement des images gadgets dans la ScrollAreaGadget. Si on quitte le fenêtre pour y revenir ou parfois quand on navigue a l'intérieur, tout s'efface et elle réaffiche les images une à une bien lentement (que c'est moche). En cliquant sur la barre de défilement tout se réaffiche alors instantanément.
J'ai essayé de trouver une solution, mais les SetScrollPos_ (de l'api) ne permettent au mieux que de bouger la barre de défilement sans que la position des images gadgets ne se rafraîchisse. En simulant un clique c'est aussi foireux... Bref rien a faire...
J'imagine que je ne suis pas le premier a avoir remarqué ce problème de Pure Basic, existe-t-il une solution ? Une amélioration est-elle prévue pour la prochaine version de PB ? Y aura-t-il des frittes se soir au dîner ?
Que de questions...
Publié : sam. 14/mai/2005 16:35
par Dr. Dri
ah bah nan pas des frittes, je les supporte pas
Dri ^^
Publié : dim. 15/mai/2005 18:15
par Fred
As tu un petit exemple ?
Publié : dim. 15/mai/2005 19:27
par Gratteur
(Je réexplique le problème plus clairement) :
Bien sur, dans le cas suivant, on peut s'amuser a minimiser la fenêtre, la réagrandir et naviguer manuellement dans le ScrollAreaGadget, quasiment a chaque fois les images se raffraichissent lentement (sauf si on clique sur les petites flèches en haut et en bas.
Si pendant ce raffraichissement on clique sur la barre du ScrollAreaGadget, alors tout s'affiche immédiatement comme ca devrait le faire dans les autres cas.
Et enfin, si on ajoute un SetScrollPos_() de l'api windows, la barre de défilement va a l'endroit indiqué mais les gadgets dans le ScrollAreaGadget ne changent pas de position (il faut cliquer sur la barre de droite pour qu'ils s'affichent).
Voici le code demandé :
Code : Tout sélectionner
If OpenWindow(0,0,0,230,650,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"LDE - Map Editor - Par Gratteur") = 0
MessageRequester("Erreur", "L'ouverture de la fenetre a échouée, installez DirectX 7 (ou +)", 0)
EndIf
CreateGadgetList(WindowID(0))
ScrollAreaGadget(0, 10, 10, 202, 623, 179, 14406, 36, #PB_ScrollArea_Raised)
Dim image(2000)
Repeat
image(i) = CreateImage(#PB_Any, 32, 32)
UseImage(image(i))
StartDrawing(ImageOutput())
Box(0, 0, 32, 32, RGB(Random(256),Random(256),Random(256)))
DrawingMode(0)
StopDrawing()
OpenGadgetList(0)
ImageGadget(#PB_Any, x, y, 36, 36, UseImage(image(i)), #PB_Image_Border)
CloseGadgetList()
x+36
If x%180 = 0
x=0
y+36
EndIf
i+1
Until i = 2000
;SetScrollPos_(GadgetID(0),#SB_VERT,500,1)
Repeat
Delay(1)
Until WindowEvent() = #PB_Event_CloseWindow
Publié : dim. 15/mai/2005 19:49
par comtois
essaye comme ça
Code : Tout sélectionner
If OpenWindow(0,0,0,230,650,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"LDE - Map Editor - Par Gratteur") = 0
MessageRequester("Erreur", "L'ouverture de la fenetre a échouée, installez DirectX 7 (ou +)", 0)
EndIf
CreateGadgetList(WindowID(0))
ScrollAreaGadget(0, 10, 10, 202, 623, 179, 14406, 36, #PB_ScrollArea_Raised)
Dim image(2000)
Repeat
image(i) = CreateImage(#PB_Any, 32, 32)
UseImage(image(i))
StartDrawing(ImageOutput())
Box(0, 0, 32, 32, RGB(Random(256),Random(256),Random(256)))
DrawingMode(0)
StopDrawing()
OpenGadgetList(0)
ImageGadget(#PB_Any, x, y, 36, 36, UseImage(image(i)), #PB_Image_Border)
CloseGadgetList()
x+36
If x%180 = 0
x=0
y+36
EndIf
i+1
Until i = 2000
;SetScrollPos_(GadgetID(0),#SB_VERT,500,1)
Repeat
Event = WindowEvent()
Select Event
Case 0
Delay(1)
Case #PB_EventCloseWindow
Quit = 1
EndSelect
Until Quit
Publié : dim. 15/mai/2005 21:05
par Fred
Effectivement, si il y'a un delay de 1 ms entre chaque evenement (sachant qu'une action peut en generer des dizaines) ca va etre lent au rafraichissement. Comtois a donné la bonne maniere de proceder. J'ai aussi complété l'aide FR qui n'avait pas cet exemple.
Publié : dim. 15/mai/2005 21:36
par Gratteur
Merci, c'était vraiment un exemple vicieux pour l'amateur que je suis ;p
Qu'en est-il du SetScrollPos_() qui "oublie" de décaler le contenue du ScrollAreaGadget() ?
C'est assez gênant :
Code : Tout sélectionner
If OpenWindow(0,0,0,230,650,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"LDE - Map Editor - Par Gratteur") = 0
MessageRequester("Erreur", "L'ouverture de la fenetre a échouée, installez DirectX 7 (ou +)", 0)
EndIf
#position_scrolling = 500
CreateGadgetList(WindowID(0))
ScrollAreaGadget(0, 10, 10, 202, 623, 179, 14406, 36, #PB_ScrollArea_Raised)
Dim image(2000)
Repeat
image(i) = CreateImage(#PB_Any, 32, 32)
UseImage(image(i))
StartDrawing(ImageOutput())
Box(0, 0, 32, 32, RGB(Random(256),Random(256),Random(256)))
DrawingMode(0)
StopDrawing()
OpenGadgetList(0)
ImageGadget(#PB_Any, x, y, 36, 36, UseImage(image(i)), #PB_Image_Border)
CloseGadgetList()
x+36
If x%180 = 0
x=0
y+36
EndIf
i+1
Until i = 2000
SetScrollPos_(GadgetID(0),#SB_VERT,#position_scrolling,1)
Repeat
Event = WindowEvent()
Select Event
Case 0
Delay(1)
Case #PB_EventCloseWindow
Quit = 1
EndSelect
Until Quit
Edit : Il y a quelque chose d'autre a ajouter dans l'aide : lorsqu'on a un écran en mode fenêtré et que l'on y affiche un sprite ou un flipbuffer() , on obtient le même bug (celui résolu par Comptois). C'est sans doute lié au taux de raffraichissement de l'écran.
Il fait aussi signaler que le delay() induit aussi ce problème d'affichage lent avec des boutons ou une toolbar.
Publié : dim. 15/mai/2005 22:36
par Fred
Je regarde ca pour le scroll
Publié : dim. 15/mai/2005 22:49
par Gratteur
Permets-moi de te remercier pour ton travail Fred, Pure Basic est vraiment génial. Je suis vraiment admiratif de tout le travail nécessaire et de ta volonté de ne pratiquer une offre plus que raisonnable, sans compter ta présence sur le forum (la plupart des admins d'autres sites ne s'en donnent pas la peinne) et les réponses a une heure si tardive. Que demander de plus ?
Vraiment, merci.
Publié : dim. 15/mai/2005 23:39
par Fred
En fait le SetScrollPos_() affecte seulement la scrollbar et n'envoie aucun element a son 'parent', donc ca ne peut pas marcher. Voici ce qu'il faut faire dans ton cas:
Code : Tout sélectionner
SendMessage_(GadgetID(0), #WM_VSCROLL, #SB_THUMBTRACK | (#position_scrolling << 16), 0)
Publié : mar. 17/mai/2005 23:08
par Gratteur
C'est impécable comme ca, merci pour les explications ^^
Publié : mar. 17/mai/2005 23:23
par Progi1984
Une fois, de plus, MERCI QUI ? MERCI FRED !

Vraiment merci pour purebasic