Nettoyer la fenetre windows

Résolu
cs_bordeaux Messages postés 35 Date d'inscription lundi 6 décembre 2004 Statut Membre Dernière intervention 14 juin 2008 - 8 mars 2006 à 20:53
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 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.

2 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
8 mars 2006 à 21:25
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.
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 mars 2006 à 22:59
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
3
Rejoignez-nous