2009-11-16 5 views
0

J'ai une très grande application winforms C# .net 2.0 qui a quelques problèmes de dessin.Dessin d'écran lent dans l'application Winforms .NET C#

Lorsque vous entrez dans différentes formes, vous pouvez voir les contrôles dessinés et même la barre de titre du formulaire en train d'être redimensionnée puis disparaître.

La forme de base dont tous les autres formulaires héritent a le code suivant dans son constructeur. Y compris la définition de DoubleBuffering à true. Les formulaires ont également un gradient d'arrière-plan, mais l'élimination de ces derniers ne fait aucune différence pour la vitesse.

Tous les contrôles et formulaires héritent des versions de base.

Que puis-je ajouter ou vérifier pour aider à la vitesse de dessin?

Code dans le OnPaint

if (this.b_UseBackgroundGradient) 
     { 
      Graphics graphics = e.Graphics; 

      Rectangle backgroundRectangle = this.ClientRectangle; 

      this.SuspendLayout(); 
      if (backgroundRectangle.Width != 0 && backgroundRectangle.Height != 0) 
      { 

       using (Brush backgroundBrush = new LinearGradientBrush(backgroundRectangle, base.BackColor, this.BackGradiantColour, LinearGradientMode.ForwardDiagonal)) 
       { 
        graphics.FillRectangle(backgroundBrush, backgroundRectangle); 
       } 
      } 
      this.ResumeLayout(); 
     } 
     else 
     { 
      base.OnPaint(e); 
     } 
+0

Faites-vous quelque chose à l'intérieur de la méthode OnPaint? –

+0

Essayez d'utiliser ce formulaire sur un poste de travail distant après cette modification. –

Répondre

0

Google autour de SuspendLayout/ResumeLayout. Je verrais aussi s'il est correct d'avoir les informations de style dans le constructeur ou s'il y a une meilleure méthode qui est appelée avant le constructeur.

2

Je dirais que vos « optimisations » vise att duper l'oeil à croire que vous dessinez everthing par vous-même dans OnPaint apparaîtra à tirer plus vite, mais à part cela, il va vraiment ralentir votre application vers le bas. Surtout si vous avez beaucoup de formulaires ouverts, puisque chacun des formulaires aura créé un énorme bitmap qui est utilisé pour le double-buffering. Donc: pour gagner de la vitesse: supprimez tout votre code ci-dessus et ne l'insérez que lorsque c'est absolument nécessaire. Après avoir vu votre code OnPaint: supprimer TOUTES les "optimisations" ET déplacer votre code OnPaint sur OnPaintBackground à la place. Assurez-vous que vous faites pas appelez base.OnPaintBackground. Jetez la mise en page Suspend/Resume.

Tous les que vous devez vraiment faire est d'utiliser OnPaintBackground au lieu de OnPaint et le reste prendra soin de lui-même.