2010-09-28 18 views
1

Tenir compte de la méthode OnPaint surchargée suivante pour un contrôle .NET:Ai-je besoin de restaurer l'état graphique après la peinture dans mon override OnPaint (pour un contrôle .NET)

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    e.Graphics.RotateTransform(180); 

    // lots of drawing code 
} 

Est-ce un problème que je fais ne restaurez pas l'état de l'objet e.Graphics lorsque j'ai terminé?

En Java, cela se fait souvent en faisant une copie de l'objet Graphics passé, ainsi l'objet Graphics transmis n'est pas modifié et il n'est pas nécessaire de restaurer son état. Similar Java Question

Je pourrais réaliser ceci dans .NET en employant les méthodes de Save()/Restore(). Donc mes questions sont:

  • est-il nécessaire/meilleure pratique en .NET pour restaurer l'état graphique?
  • combien coûtent les méthodes Save()/Restore()?

Répondre

1

Eh bien, celui qui va mettre en œuvre l'événement Paint pour le contrôle va avoir une petite surprise. Cela pourrait être valable s'il est logique que tout tourne toujours, mais c'est à vous de décider.

Graphics.Save + Restore prend environ 4 microsecondes sur mon ordinateur portable. Rien à craindre vu la dépense typique du dessin.

+0

Si Enregistrer et restaurer sont si rapides alors je pense que je vais les utiliser pour restaurer l'état à la fin de mon OnPaint. – GarethOwen

+0

En fait, je n'ai pas vu que vous appeliez base.OnPaint() * avant * le dessin. Ce qui n'est pas correct, vous devez autoriser un gestionnaire d'événement client à dessiner sur le vôtre. Mettez base.OnPaint en bas et appelez Restore() avant cela. –

+0

Je ne suis pas sûr si ce n'est pas correct. Ma classe de base est un Panel, et si cela a une couleur ou une image de fond je veux que cela soit dessiné avant que je me dessine. – GarethOwen