cs_bordeaux
Messages postés35Date d'inscriptionlundi 6 décembre 2004StatutMembreDernière intervention14 juin 2008
-
8 mars 2006 à 20:53
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 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.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 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.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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