Nettoyer la fenetre windows [Résolu]

cs_bordeaux 35 Messages postés lundi 6 décembre 2004Date d'inscription 14 juin 2008 Dernière intervention - 8 mars 2006 à 20:53 - Dernière réponse : SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention
- 8 mars 2006 à 22:59
Bonjour,

je viens de faire ma premiere application grpahique et je remarque que lorsque le call_back WS_PAINT est appele,
il ne nettoie pas la fenetre.
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
AfficherContenu(hWnd );
EndPaint(hWnd, &ps);
break;

En effet, les elements sont conserves sur la fenetre et donc superposer aux nouveaux.
Comment faut-il faire pour nettoyer la fenetre de tous les elements graphiques qui la compose?

Entre deux appels de WM_PAINT, les valeurs de AfficherContenu sont modifies.
Et lors du deuxieme appel la fenetre affiche les anciens et les nouveaux.

Merci d'avance.
Afficher la suite 

2 réponses

Répondre au sujet
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 8 mars 2006 à 21:25
+3
Utile
Salut,

Pour forcer la fenetre a se redessiner completement il faut utiliser
InvalidateRect() en passant TRUE en dernier param, et eventuelement
UpdateWindow() juste apres. Dans tout les cas, il ne faut jamais
envoyer soit meme un WM_PAINT a une fenetre.

Par contre il semble que ton prog soit mal structuré, lors du WM_PAINT
il faut dessiner en utilisant le HDC retourné par BeginPaint(), ce que
ta fonction AfficherContenu() ne semble pas faire.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_aardman
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 8 mars 2006 à 22:59
+3
Utile
Ouais mais attention, ne met jamais de InvalideRect dans WM_PAINT car tu va faire ramer l'ordi au complet. Si tu veut une actualisation à intervale régulié avec cette technique, fait toi un timer (étudie la fonction SetTimer et WM_TIMER)

Petit exemple:

case WM_CREATE:
SetTimer((Le hWnd de ta procédure), (l'ID du timer (1,2,3...)), (l'intervale en milliseconde), (le timerproc. tu peut le mettre null));
/* ce que tu a à faire */
break;

case WM_TIMER:
/* ce que tu a à faire */
break;

Et n'oublie pas a la fin du programme de fermer le timer avec KillTimer dans WM_DESTROY ou WM_CLOSE
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SAKingdom

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.