views:

732

answers:

2

I have a very large C# .net 2.0 winforms application which has some drawing issues.

When going into different forms you can see controls being drawn and even the title bar of the form being resized and then disappearing.

The base form that all other forms inherit from has the following code in its constructor. Including setting DoubleBuffering to true.

this.SetStyle(ControlStyles.UserPaint, true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.UpdateStyles();

The forms also have a backgroundgradient, but removing this makes no difference to the speed.

All controls and forms inherit from base versions.

What can i add or check to help with the drawing speed?

Code within the 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);
        }
A: 

Google around for SuspendLayout/ResumeLayout. I would also have a look to see if it is correct to have the stylign information in the constructor or if there is a better method that is called before constructor.

Burt
+2  A: 

I'd say that your "optimizations" is aimed att fooling the eye to believe that everthing you draw by yourself in OnPaint will appear to draw faster, but apart from that, it will really slow your application down. Especially if you have a lot of forms open, since each one of the form will have created a huge bitmap which is used for double-buffering.

So: in order go gain speed: remove all of your code above and insert it only where absolutely needed.

EDIT: After I saw your OnPaint-code: remove ALL "optimizations" AND move your OnPaint code to OnPaintBackground instead. Make sure that you do not call base.OnPaintBackground. Throw away Susped/Resume layout.

All that you really need to do is to use OnPaintBackground instead of OnPaint and the rest will take care of itself.

danbystrom