Page 1 sur 1
Problème de régénération écran
Publié : lun. 09/févr./2004 14:47
par brossden
Bonjour
Durant certaines phases de programme assez longues, la régénération de l'affichage ss fait mal, voisr pas dutout, par exemple durant le replissage d'une ListIcon, comment faire pour forcer de temps à autre cette régénération, en d'autre terme, comme faire pour redonner momentanéement la main à windows ?
Merci pour vos éventuelles réponses !
Denis
Publié : lun. 09/févr./2004 16:20
par Anonyme2
Si tu aurais une peu de code à mettre pour voir comment ça se passe.
Sinon, dans ma librairie, lorsque je met de la couleur ou autre à une élément, j'oblige la liste à être redessiner avec l'API RedrawWindow. Si je ne met pas cette API, les couleurs ne sont pas mises tout de suite, elles le sont lorsque les événement Paint(Repaint) sont envoyés par le système. Tu peut l'utiliser pour obliger les éléments à être affichés.
Tu peux aussi utiliser le message #LVM_REDRAWITEMS qui force les éléments à être redessinés. wParam est l'index du premier élément à redessiner, sachant que le tout premier de la liste a l'index 0 et lParam est l'index du dernier élément à redessiner, ce message évite de tout redessiner.
SendMessage_(GadgetID(#Gadget), #LVM_REDRAWITEMS , wparam, lParam)
Voici l'équivalent en PB de ce que j'utilise dans ma lib :
RedrawWindow_(GadgetHwnd, 0, 0, 7) ou GadgetHwnd = GadgetID(#Gadget) ou si c'est sur le header de la listIcon, HeaderID().
Publié : lun. 09/févr./2004 16:28
par Anonyme2
Comme j'ai été confronté plusieurs fois à ces problèmes, j'ai utilisé aussi ceci:
avant de remplir la listicon, je verrouille l'affichage (en fait j'interdis que la fenêtre change, puis je rempli la list ou même d'autre chose (c'est le cas lorsque je trie une liste avec mon code perso) puis ensuite je déverrouille l'affichage et ça apparait.
L'avantage c'est que celà va plus vite car on évite d'avoir à redessiner des dizaines de fois par seconde la liste et en plus, de redessiner la(les) scrollbar qui elles aussi prennent du temps à être redimensionner et redessinées.
Voici le code :
LockWindowUpdate_(GadgetID(#Gadget)) ; verrouille la fenetre du gadget
; ici tu met le code que tu veux, mais évite de mettre des RedrawWindow qui n'aurait pas de sens.
LockWindowUpdate_(0) ; déverouille la fenêtre et le paramêtre est 0
Publié : lun. 09/févr./2004 18:20
par Le Soldat Inconnu
UpdateWindow_(windowid()) permet à windows de rafraichir l'affichage en stoppant l'execution du prog tant l'affichage n'est pas réalisé correctement
Publié : mar. 10/févr./2004 9:10
par brossden
Bonjour à tous
Je viens remercier ici tous ceux qui on répondu à ma question.
J'ai testé vos solutions et j'en suis trés satisfait.
Code : Tout sélectionner
;-
; Traitement long avec ou sans détérioration de l'affichage
;-
res = UpdateWindow_(WindowID(#Window_0)) ;Régénération de l'affichage
;-
; Suite du traitement
Il est possible aussi de régénérer de temps à autre l'affichage pour avoir l'impression d'une certaine fluidité dans la progression, sans pour autant ralentir l'application d'une manière trop significative.
Encore merci à tous
Denis
Publié : mar. 10/févr./2004 13:03
par Anonyme2
Salut
essaye le code en supprimant UpdateWindow_(GadgetID(#Window_0))
et dis-moi si ça marche, car moi ça marche sans ce UpdateWindow_(GadgetID(#Window_0)) qui en fait envoi un message WM_Paint et donc à ce moment là, celà ne sert à rien d'avoir bloqué l'affichage avant puisque l'on recommence une nouvelle phase