GraphicsDoubleBuffer

来源:互联网 发布:java字符串替换函数 编辑:程序博客网 时间:2024/05/21 07:06

http://www.codeproject.com/vb/net/GraphicsDoubleBuffer.asp#xxxx

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:

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.
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:
Dim g2 as graphics = g.store() g2.FillRectangle(New SolidBrush(Color.black), New Rectangle(20, 20, 20, 20))
Example 2:
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:
g.paint(Me)

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

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

About VectorX


Currently I am building my new website http://www.codevendor.com. All updates to my code tutorials will be listed there.

If you need to talk to me in person you can chat with me on efnet irc in the #asp, #asp.net or #mscolib channels.

Latez,

VectorX

Click here to view VectorX's online profile.

原创粉丝点击