English 中文(简体)
Slow screen drawing in .Net C# winforms application
原标题:

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);
        }
问题回答

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.

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.





相关问题
Bring window to foreground after Mutex fails

I was wondering if someone can tell me what would be the best way to bring my application to the foreground if a mutex was not able to be created for a new instance. E.g.: Application X is running ...

How to start WinForm app minimized to tray?

I ve successfully created an app that minimizes to the tray using a NotifyIcon. When the form is manually closed it is successfully hidden from the desktop, taskbar, and alt-tab. The problem occurs ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

Handle DataTable.DataRow cell change event

I have a DataTable that has several DataColumns and DataRow. Now i would like to handle an event when cell of this DataRow is changed. How to do this in c#?

Apparent Memory Leak in DataGridView

How do you force a DataGridView to release its reference to a bound DataSet? We have a rather large dataset being displayed in a DataGridView and noticed that resources were not being freed after the ...

ALT Key Shortcuts Hidden

I am using VS2008 and creating forms. By default, the underscore of the character in a textbox when using an ampersand is not shown when I run the application. ex. "&Goto Here" is not ...

WPF-XAML window in Winforms Application

I have a Winforms application coded in VS C# 2008 and want to insert a WPF window into the window pane of Winforms application. Could you explain me how this is done.

热门标签