InvalidateRect en boucle.

Signaler
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006
-
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006
-
Bonjour,

Je voudrais envoyer plusieurs fois le message InvalidateRect lors
de l'appuie sur une touche du clavier (case WM_KEYDOWN) pour provoquer à chaque fois l'affichage d'une ligne de texte (les unes en-dessous des autres) dans la section : case WM_PAINT.

J'ai donc mis InvalidateRect en boucle du genre :
for(i = 0; i < 10; i++)
{
InvalidateRect(hwnd, NULL, FALSE);
}
mais qu'une seule ligne s'affiche comme s'il n'y avait eu qu'un seul appel à InvalidateRect.
Note: Si par contre j'appuie plusieurs fois sur une touche, l'affichage fonctionne comme
prévu.

Est ce que quelqu'un aurait une idée ?

Merci

Tintin 72

4 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
InvalidateRect change juste la zone à dessiner, si tu n'envoie pas de
WM_PAINT, tu ne sais pas quand elle sera effectivement redessinée.
Envoie donc un WM_PAINT ou plus simplement fais un UpdateWindow
aussitôt après le invalidateRect
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006

Effectivement, ça marche avec un UpdateWindow à la suite.


Merci !


PS : Mais pourtant je croyais que InvalidateRect, du fait qu'il invalidait un rectangle, générait


un message WM_PAINT pour que la zone client soit rafraîchit. Qu'en est-il exactement ?

Tintin 72
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu peux lire ce que dit la MSDN, c'est assez complet la dessus. En gros
on sait qu'il y aura un autre WM_PAINT mais on ne sait pas quand.
J'avoue que c'est aussi assez flou dans mon esprit.

Voila un passage que j'ai trouvé qui explique que le WM_PAINT n'est pas envoyé automatiquement après un InvalidateRect:



In this example, the NULL argument used by [pantdraw_7ano.htm InvalidateRect] specifies the entire client
area; the TRUE argument causes the background to be erased. If you do not want
the application to wait until the application's message queue has no other
messages, use the [pantdraw_4zef.htm UpdateWindow] function
to force the [pantdraw_88ac.htm WM_PAINT] message to be sent
immediately. If there is any invalid part of the client area,
UpdateWindow sends the WM_PAINT message for the specified window
directly to the window procedure.
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006

C'est bon à savoir.

Encore merci !

Tintin 72