2010-07-07 7 views
5

Je ne suis pas sûr de la meilleure façon d'utiliser les graphiques - dois-je attacher mes classes à l'événement principal de Paint, puis faire le dessin, ou mieux l'appeler à partir de OnPaint vide comme ce? Je veux dire, est-il correct de le faire comme ceci:C# WinForms - Questions de méthode de peinture

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e) //what is this good for? My app works without it as well 
    Graphics g=e.Graphics; 
    DrawEnemies(g); 
    UpdateHUD(g); 
    DrawSelectedUnit(g); 
} 
+4

'OnPain' ne compilera pas, sauf s'il s'agit en fait d'une sous-classe d'une classe qui supporte la torture physique;) – Thomas

+2

Aw @Thomas, vous auriez pu le modifier. – Lazarus

+1

Nah. Je suis trop spirituel pour ça. (De plus, j'ai récemment été réprimandé pour avoir modifié une erreur de copier/coller dans le code de quelqu'un, mais ce n'est pas la raison pour laquelle je me suis abstenu de l'éditer ici.) – Thomas

Répondre

6

Il est recommandé que les contrôles remplacent les méthodes On... plutôt que de souscrire à leurs propres événements.

Vous devez appeler le base.OnPaint pour vous assurer que la méthode Paint est déclenchée correctement.

From MSDN:

La méthode OnPaint permet également classes dérivées à gérer l'événement sans y attacher un délégué. C'est la technique préférée pour traiter l'événement dans une classe dérivée.

Notes HÉRITIERS
Lors de la substitution OnPaint dans une classe dérivée, assurez-vous de appel OnPaint de la classe de base de la méthode afin que les délégués inscrits reçoivent l'événement.

+0

En général, en remplaçant OnPaint, vous n'avez plus besoin de déclencher les événements Paint, donc base.OnPaint n'est pas obligatoire. MSDN dit, mais tout n'est pas à suivre exactement. De la même manière, vous substituez OnBackgroundPaint et commentez base.OnBackgroundPaint NE PAS repeindre l'arrière-plan - contre le scintillement. – serhio

+0

@serhio: Le moyen d'empêcher la peinture d'arrière-plan est de ne pas surcharger OnBackgroundPaint (c'est la méthode de la force brute old school transférée de Win32). Au lieu de cela, vous devez définir le style de contrôle pour inclure 'AllPaintingInWmPaint'. –

+0

De MSDN: 'Lors de la substitution de OnPaintBackground dans une classe dérivée, il n'est pas nécessaire d'appeler OnPaintBackground de la classe de base .' http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground. aspx – serhio

3

Cela n'a pas vraiment d'importance; les deux fonctionnent. Surcharge OnPaint pourrait être un peu plus rapide en théorie, mais ce n'est pas une différence que personne ne remarquera. Microsoft recommande de surcharger OnPaint mais ne motive pas vraiment cela.

Vous devez appeler base.OnPaint car cette méthode appellera des gestionnaires attachés à l'événement Paint.