2009-11-23 23 views
0

Je sais que WM_PAINT dit à une fenêtre qu'il doit se repeindre entièrement, mais apparemment ce n'est pas le message qui est envoyé quand il a été partiellement couvert et ensuite la fenêtre qui était devant lui n'est plus gênante et elle a besoin repeindre la partie sale. Est-ce que quelqu'un sait quel message est envoyé dans ce cas?Quel message Windows est envoyé pour repeindre une fenêtre partiellement masquée?

EDIT: Trouvé le problème:

La question implique un contrôle Delphi je l'ai écrit pour intégrer une surface de rendu SDL sur une forme Delphi. SDL a une API pour construire son moteur de rendu sur HWND d'une autre fenêtre, et il le marque comme une "fenêtre étrangère". SDL traite généralement WM_PAINT en interne, donc j'ai fini par devoir ajouter du code à WindowProc de SDL pour transférer le message sur le WindowProc externe s'il s'agit d'une fenêtre étrangère. Cela fonctionnait parfois, mais il s'est avéré qu'il y avait un petit problème qui enlevait le drapeau de la fenêtre étrangère de la structure de données de la fenêtre, de sorte qu'il avalait le message au lieu de le transmettre à mon application. Une fois que j'ai corrigé cela, j'ai commencé à recevoir les messages WM_PAINT tout le temps.

+0

Toutes les 5 réponses sont correctes: WM_PAINT est le message * qui est envoyé lorsque tout ou partie de votre espace client doit être repeint.Sur les nouvelles versions de Windows, il n'est pas envoyé aussi souvent qu'auparavant, car Windows cache le bureau de manière beaucoup plus agressive afin d'obtenir les effets visuels de la fenêtre et de la fenêtre en verre - Windows peint à partir de bitmaps internes N'envoie aucun message du tout dans ce cas. –

Répondre

1

Pourquoi dites-vous que ce n'est apparemment pas? WM_PAINT doit être appelée pour des retraits partiels (le rect d'actualisation est renvoyé par BeginPaint ou GetUpdateRect). S'il ne semble pas être appelé, il peut y avoir un bug ailleurs dans votre application qui l'empêche. Que voyez-vous qui vous amène à croire que ça ne marche pas?

+0

Parce que j'ai un composant Delphi avec une méthode pour gérer WM_PAINT, mais il n'est pas appelé pour des retraits partiels. Je peux seulement conclure, alors, qu'aucun WM_PAINT n'est envoyé. Soit ça, ou quelque chose ne va pas, quelque part le long de la ligne, parce que je * l'obtiens juste bien pour les peintures complètes. –

+0

Que faites-vous pour invoquer un redraw partiel (et quel OS?) – Toji

+0

Je ne vois que cela sur XP, car Vista stocke l'apparence de chaque formulaire dans son propre tampon avant de les dessiner à l'écran. Ce que je fais, c'est ouvrir une autre fenêtre, qui apparaît devant le formulaire que j'utilise, puis ramener ma forme au premier plan. Tout est repeint correctement sauf le composant unique, qui ne reçoit jamais de message WM_PAINT, et j'essaie de comprendre ce qui se passe et pourquoi. –

0

Je suis assez certain que l'API Win32 utilise WM_PAINT même pour les repeints partiels. De MSDN:

Le message WM_PAINT est envoyé lorsque le système ou une autre application fait une demande de peinture une partie de la fenêtre d'une application. [Mes italiques].

Ce lien a le détail complet sur WM_PAINT mais si, comme vous le dites, le message WM_PAINT est pas envoyé pour redessine partiel, le Spy++ est l'outil que vous devez savoir pour sûr.

1

WM_PAINT est envoyé pour indiquer qu'une partie (y compris la totalité) de la fenêtre doit être repeinte.

Appelez GetUpdateRect() pour obtenir un rectangle délimitant la région à mettre à jour. Ces informations sont également incluses dans PAINTSTRUCT (en tant que champ rcPaint) passé à BeginPaint().

0

Jetez un coup d'œil à WM_PRINTCLIENT. Dans certaines circonstances, WM_PAINT n'est pas envoyé et un message WM_PRINTCLIENT est envoyé à la place. (AnimateWindow par exemple.)