Message WM_PAINT

Résolu
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008 - 30 sept. 2006 à 12:38
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008 - 30 sept. 2006 à 19:15
Bonjour

Je m'excuse si ca semble une question de debutant mais c'est la premiere fois que je dessine dans une fenetre windows :(

Je me suis rendu compte que le message WM_PAINT est envoyer a ma fenetre "tout le temps" (!!!) et ainsi m'oblige a redessiner cette fenetre chaque instant alors que j'en ai pas besoin. Est ce normal ? Et peut on supprimer cet effet qui me bouffe du temps CPU pour rien ?

merci d'avance

9 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 sept. 2006 à 12:46
WM_PAINT est envoyé par le système quand il y a besoin et non tout le temps.

ciao...
BruNews, MVP VC++
3
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
30 sept. 2006 à 13:05
Oui , cela vient de toi, car comme l'a dit BruNews, WM_PAINT est appelé seulement lorsque la fenêtre à besoin d'être re-dessiné.

++
deck_bsd

[http://deck-bsd.eurower.net]
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 sept. 2006 à 16:29
NON et NON, exemple à ne pas suivre.

Faudrait surtout voir ce qu'il y a dans ton WM_PAINT parce que pas normal du tout, devrait toujours retourner 0.

ciao...
BruNews, MVP VC++
3
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008
30 sept. 2006 à 16:53
Ca y est j'ai tout compris !! ouf !!!

J'avais tout simplement oublier de valider ma zone de dessin

Grace a "ValidateRect(hwnd,NULL);" tout fonctionne bien et je retourne bien zero.

Toutes mes excuses pour le post precedent, je sais pas pourquoi ca marchait mais brunews dit exemple a ne pas suivre donc encore une fois excuser moi.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008
30 sept. 2006 à 12:54
OK donc c'est moi qui ai merdé quelque part dans mon code. Je vais essaye de trouver mon erreur. Merci pour la reponse si rapide.
0
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008
30 sept. 2006 à 16:01
Bon il semblerait que j'ai trouvé l'erreur, je la post au cas ou d'autres auraient le meme probleme que moi :

au lieu de faire :

HRESULT CALLBACK wndProc(....)
{
   switch (message)
   {
      ....
      case WM_PAINT :
         ... // on dessine
         return 0;
      .....
   }
}

j'ai fait :

HRESULT CALLBACK wndProc(....)
{
   switch (message)
   {
      ....
      case WM_PAINT :
         ... // on dessine
         return DefProcWindow(...);
      .....
   }
}

et la tout va bien.

La seule chose que je ne comprend pas c'est que dans la MSDN ils disent bien que l'appli doit retourner 0 apres le traitement du message WM_PAINT mais bon ca marche c'est le principal.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
30 sept. 2006 à 18:26
Salut,

En théorie, tu n'a pas besoin de valider la zone de dessin, c'est BeginPaint() qui le fait.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 sept. 2006 à 19:12
C'est tout à fait certain, c'est aussi le rôle du couple BeginPaint() EndPaint(), on n'a pas à valider la zone soi-même.
Il y a certainement un prob de conception dans ton prog, faut faire gaffe à la réentrance des messages.

ciao...
BruNews, MVP VC++
0
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008
30 sept. 2006 à 19:15
j'ai utiliser BeginPaint et EnPaint et ca marche merci
0