Problème de régénération écran

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Problème de régénération écran

Message par brossden »

Bonjour 8O

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 ! :wink:

Denis
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Si tu aurais une peu de code à mettre pour voir comment ça se passe. :roll:

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().
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour à tous :wink:

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
Dernière modification par brossden le mar. 20/sept./2011 20:43, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Répondre