ScrollAreaGadget, contenaire pas bien !
ScrollAreaGadget, contenaire pas bien !
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...
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...
(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é :
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
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
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 :
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.
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
Il fait aussi signaler que le delay() induit aussi ce problème d'affichage lent avec des boutons ou une toolbar.
Dernière modification par Gratteur le dim. 15/mai/2005 22:44, modifié 1 fois.
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.
Vraiment, merci.
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)
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Une fois, de plus, MERCI QUI ? MERCI FRED ! 
Vraiment merci pour purebasic

Vraiment merci pour purebasic
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net