Click here to Skip to main content
15,888,303 members
Articles / Programming Languages / Visual Basic
Article

GraphicsDoubleBuffer

Rate me:
Please Sign up or sign in to vote.
4.16/5 (17 votes)
27 Jul 2004 77.1K   22   18
This is a simple class designed to remove flickering from painting controls with gdi+

Introduction

This is a simple class i designed to remove flickering from painting controls with gdi+. The class removes flickering by double buffering the drawing. It draws on a separate bitmap canvas file. Once all drawing is complete, you can then push the drawing to the main drawing canvas all at once. This will kill most if not all flickering the drawing produces.

Code

Below is the simple class:

VB.NET
Public Class GraphicsDoubleBuffer

        Private P_Canvas As Bitmap

        Public Property [Canvas]() As Bitmap
            Get
                Return P_Canvas
            End Get
            Set(ByVal Value As Bitmap)
                P_Canvas = Value
            End Set
        End Property

        Public Sub New(ByVal CanvasWidth As Integer, 
                   ByVal CanvasHeight As Integer)
            P_Canvas = New Bitmap(CanvasWidth, CanvasHeight)
        End Sub

        Public Function Store() As Graphics

            Dim g As Graphics = Graphics.FromImage(P_Canvas)
            Return g

        End Function

        Public Sub Paint(ByVal Where As Object)

            Dim g As Graphics = Where.CreateGraphics()
            g.SmoothingMode = SmoothingMode.None
            Dim g2 As Graphics = Graphics.FromImage(P_Canvas)
            g2.SmoothingMode = SmoothingMode.None
            g.DrawImage(P_Canvas, 0, 0)
            g.Dispose()
            g2.Dispose()

        End Sub

        Public Sub [Dispose]()

            P_Canvas.Dispose()

        End Sub

    End Class
To use this class in your custom control add the following code to your project.
VB.NET
Dim g As New GraphicsDoubleBuffer(ClientRectangle.Width, 
    ClientRectangle.Height)
g.Store()
g.Paint(Me)
g.Dispose()

Start by declaring a constructor to the GraphicsDoubleBuffer() Class. Pass the the constructor the drawing dimensions of your canvas or form. Next use store() as your new gdi+ graphics object. You can do this several ways.

Example 1:
VB.NET
Dim g2 as graphics = g.store() 
g2.FillRectangle(New SolidBrush(Color.black), New Rectangle(20, 20, 20, 20))
Example 2:
VB.NET
g.store.FillRectangle(New SolidBrush(Color.black), 
    New Rectangle(20, 20, 20, 20))
After you have drawn to the store() graphics object, you then must push it to your main drawing canvas like so:
VB.NET
g.paint(Me)

"Me" must be the user control or form. After that we dispose() of the drawing object to clear it from memory.

VB.NET
g.dispose()

Resources

Conclusion

Well this concludes my simple double buffering class. If you use this class properly, it can be a vital resource to you. Latez, VectorX

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior) Codevendor
United States United States
Please visit my personal website https://codevendor.com for my latest codes and updates.

Comments and Discussions

 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey18-Feb-12 3:28
professionalManoj Kumar Choubey18-Feb-12 3:28 
GeneralVery nice Pin
VaclavAntosik27-Nov-07 11:49
VaclavAntosik27-Nov-07 11:49 
GeneralAre there a faster vb .net grapihcs Pin
masterdima21-Jun-07 10:33
masterdima21-Jun-07 10:33 
GeneralRe: Are there a faster vb .net grapihcs [modified] Pin
M@dHatter21-Jun-07 15:03
M@dHatter21-Jun-07 15:03 
The only thing i can suggest is to get max performance out of GDI+ is to use global brushes,fonts,colors,pens,etc. and dont dispose of them until your app closes. Try to use paths if you can to draw your lines.

Test your calculations without drawing them and see if it takes a long time. It might be your loops and calculations, instead of the drawing. See if you can globally store your calculations if they dont change.

Try drawing like this example to a offscreen bitmap. Try to make the bitmap global and dont dispose of it on every pass, instead just paint over it with a background color rectangle. If your drawing has alot of colors then keep your graphics set on high quality, if not try moving the setting to low or anti. Another thing to check is bitmap width and height and make sure it is set to the size that you need and not some 2400px by 2400px size Smile | :) size has alot to do with memory and speed to render.

Another trick of the trade for rendering is to draw like windows gui. Only draw a section rather than the entire whole bitmap. For example say only a small area of your drawing needs to be rendered but everything else stays the same. Draw a rectangle with those cords and paint the background color and then draw the new on top of it just for that location.

i.e

XXXXXXXXXXXXXXXXXXXXXXXXXXX
X.Whole Bitmap or surface............X
X.............................................X
X.................xxxxxxxxxxxxx..........X
X.................x Draw Only x..........X
X.................x This!........x..........X
X.................xxxxxxxxxxxxx..........X
X.............................................X
XXXXXXXXXXXXXXXXXXXXXXXXXXX

This is usually the fastest drawing solution.

If all else fails try using directx...but GDI+ should be fast enough to render almost game speed, 256 colors.









-- modified at 21:15 Thursday 21st June, 2007
GeneralIt's a bit slow, is there a faster way Pin
masterdima17-Jun-07 12:54
masterdima17-Jun-07 12:54 
GeneralRe: It's a bit slow, is there a faster way Pin
M@dHatter17-Jun-07 15:00
M@dHatter17-Jun-07 15:00 
GeneralRe: It's a bit slow, is there a faster way Pin
masterdima17-Jun-07 17:18
masterdima17-Jun-07 17:18 
Generalthanks Pin
suchinoko23-May-07 18:14
suchinoko23-May-07 18:14 
GeneralThanks Pin
netislander19-Mar-07 9:37
netislander19-Mar-07 9:37 
Questionwhat about the SetStyles method ? Pin
alpha_centurian4-Sep-06 17:45
alpha_centurian4-Sep-06 17:45 
GeneralThe really old days Pin
Giles28-Jul-04 20:44
Giles28-Jul-04 20:44 
Generalvoid xbios(26) ? Pin
Kochise28-Jul-04 21:13
Kochise28-Jul-04 21:13 
GeneralRe: void xbios(26) ? Pin
Giles29-Jul-04 11:25
Giles29-Jul-04 11:25 
Generalor you could just Pin
Allen Anderson28-Jul-04 14:30
Allen Anderson28-Jul-04 14:30 
GeneralRe: or you could just Pin
M@dHatter28-Jul-04 16:36
M@dHatter28-Jul-04 16:36 
GeneralRe: or you could just Pin
Matthew Adams30-Jul-04 8:09
professionalMatthew Adams30-Jul-04 8:09 
GeneralRe: or you could just Pin
M@dHatter30-Jul-04 10:16
M@dHatter30-Jul-04 10:16 
GeneralRe: or you could just Pin
Rhy Mednick3-Aug-04 6:12
Rhy Mednick3-Aug-04 6:12 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.