web-dev-qa-db-fra.com

Comment appeler l'événement Paint?

Mon programme dessine le texte sur son panneau, mais si je souhaite supprimer le texte, je dois le repeindre.

Comment appeler (relancer) l'événement Paint à la main?

43
Ivan Prodanov

La méthode Invalidate () provoquera une nouvelle peinture.

MSDN Link

41
Matthew Vines

Dans une méthode de votre formulaire ou de votre contrôle, vous avez 3 choix:

this.Invalidate();  // request a delayed Repaint by the normal MessageLoop system    
this.Update();      // forces Repaint of invalidated area 
this.Refresh();     // Combines Invalidate() and Update()

Normalement, vous appelez simplement Invalidate() et laissez le système le combiner à d’autres mises à jour de Screen. Si vous êtes pressé, appelez Refresh(), mais vous courez le risque de le repeindre plusieurs fois de suite à cause d'autres contrôles (en particulier celui du parent) qui invalide. 

La manière normale utilisée par Windows (Win32 et WinForms.Net) consiste à attendre que MessageQueue s’exécute, puis à traiter toutes les zones d'écran invalidées. C'est efficace parce que quand quelque chose change, cela se transforme généralement en autre chose (contrôle). 

Le scénario le plus courant pour Update () survient lorsque vous modifiez une propriété (par exemple, label1.Text, ce qui invalidera l'étiquette) dans une boucle for et que cette boucle bloque temporairement la boucle Message. Chaque fois que vous l'utilisez, vous devriez vous demander si vous ne devriez pas utiliser un thread à la place. Mais la réponse n'est pas toujours oui. 

85
Henk Holterman

J'ai trouvé le Invalidate () créer trop de scintillement. Voici ma situation. Un contrôle personnalisé que je développe dessine son tout le contenu via la gestion de Paint .

this.Paint += this.OnPaint;

Ce gestionnaire appelle une routine personnalisée qui effectue la peinture.

private void OnPaint(object sender, PaintEventArgs e)
{
    this.DrawFrame(e.Graphics);
}

Pour simuler le défilement, je veux repeindre ma commande chaque fois que le curseur se déplace alors que le bouton gauche de la souris est enfoncé. Mon premier choix utilisait le Invalidate () comme ci-dessous.

private void RedrawFrame()
{
    var r = new Rectangle(
        0, 0, this.Width, this.Height);

    this.Invalidate(r);
    this.Update();
}

La commande défile correctement mais clignote bien au-delà de tout niveau confortable. J'ai donc décidé, au lieu de repeindre le contrôle, d'appeler ma méthode personnalisée DrawFrame () immédiatement après avoir manipulé l'événement MouseMove . Cela a produit un défilement lisse sans scintillement.

private void RedrawFrame()
{
    var g = Graphics.FromHwnd(this.Handle);
    this.DrawFrame(g);
}

Cette approche peut ne pas être applicable à toutes les situations, mais jusqu'ici cela me convient bien.

6
user2529145

Je pense que vous pouvez aussi appeler Refresh().

5
Brian

Appelez control.invalidate et l'événement Paint sera déclenché.

4
Otávio Décio

Rafraîchir permettrait probablement un code beaucoup plus lisible, selon le contexte.

3
Simon Nunn

utiliser Control.InvokePaint vous pouvez également l'utiliser pour la double mise en mémoire tampon manuelle

0
TheNegative