2010-02-02 4 views

Répondre

6

CWnd::Invalidate() invalide toute la zone client d'une fenêtre, ce qui indique que la zone est obsolète et doit être repeinte. Vous appelez généralement ceci sur un contrôle qui doit être redessiné. CWnd::InvalidateRect() invalide seulement une partie de la fenêtre.

Avec les fonctions Invalidate, le message WM_PAINT indiquera [non strictement vrai; voir les commentaires] dans la file d'attente des messages et traités à un moment donné dans le futur. CWnd::UpdateWindow() envoie (par opposition aux messages) un message WM_PAINT, provoquant le redessin des régions invalidées immédiatement.

Vraiment, tout cela est dans les docs.

+0

vous voulez dire, nous ne devrions pas appeler "Invalidate" ou "CWnd :: UpdateWindow()" à une instance dans l'application droite? nous devons appeler l'un ou l'autre à droite pour obtenir le message wm_paint – Naruto

+3

En effet. Appeler les deux n'est pas nécessaire. Vous n'appelez généralement 'UpdateWindow' que si le même thread effectue un long calcul par la suite, de sorte qu'il ne retournera pas assez vite à sa boucle de message. Dans ce cas, vous voulez repeindre immédiatement, ne pas attendre un moment plus pratique. Mais en général, utilisez 'Invalidate'. – Thomas

+0

oh ok Merci ... – Naruto

1

La fonction invalidate marque la zone de dessin comme invalidée. Ce drapeau est utilisé lorsque la fenêtre est redessinée, si la zone est invalidée, elle redessine la zone, sinon elle laissera simplement la zone de l'écran telle qu'elle est. invalidate invalide la totalité de la zone client d'un objet donné, invalidaterect invalide une région spécifique de la zone client. La fonction de mise à jour effectue le redraw réel. La raison d'un tel mécanisme, et pas seulement de dessiner immédiatement quand vous savez que quelque chose doit être changé, c'est que vous pouvez empêcher plusieurs retraits, disons par exemple que vous avez reçu trois messages en une fois, qui font défiler une zone de texte. Si vous redessiniez la zone de texte pour chacune des touches, vous deviez dessiner la zone de texte trois fois et l'application ne répondait plus. En traitant à la place tous les événements clés, en mettant à jour la structure de données attachée à la zone de texte et en invalidant la zone de texte avant de redessiner la zone de texte, vous redessinez seulement la zone de texte une fois.

Questions connexes