Click here to Skip to main content
Click here to Skip to main content

Flicker free drawing using GDI+ and C#

By , 28 Jul 2003
 

Sample Image - flickerFreeDrawing.jpg

Introduction

This article describes how to implement flicker free drawing on Windows Forms using GDI+, it assumes you have a basic understanding or VS.NET, C# and the .NET framework.

Background

Flicker free drawing or double buffering is a well know technique used in the Windows programming world to reduce flicker when handling paint events in a window.

Normally a generic window programs draw directly to the device context (Graphics Object) when a WM_PAINT (Paint) event occurs. This can lead to flickering if the window is refreshed (Invalidated) repeatedly. Three examples where flickering happen would be during a Window resize or animation (a timer is fired and in the timer event the window is refreshed) or when a object is dragged over the window (e.g. Visio)

We can eliminate flickering using a technique known as double buffering. Rather than drawing directly on the graphics object, we draw to an off screen graphics object and when the drawing is complete we draw the off screen graphics object onto the graphics object supplied by the Paint event. We also override the OnPaintBackground method to prevent the windows form performing any background rendering (we must paint the background ourselves during the rendering in the off screen graphics object, this is usually the first thing that is done).

The double buffering technique is encapsulated in a simple class called DBGraphics and can be easily implemented in a typical windows form based application show below.

Using the code

The double buffering class can be used within the scope of the windows form. The steps below describe how to implement the DBGraphics class in your code:

  • Step 1 - Declare the DBGraphics variable in your windows form class and instantiate the object in the windows form constructor.
using GDIDB; // Declare the namespace
  
 public class MainWnd : System.Windows.Forms.Form
{
     ... Some other code
    private DBGraphics memGraphics;
     ... Some other code
      
    public MainWnd()
    {    
        memGraphics = new  DBGraphics();
    }           
     
}; 
  • Step 2 - Handle the resize and load event to create the double buffer object to the size of the Client Rectangle. This is done in form load event as the resize event only gets fire when the form is manually resized. One thing to note here is we need to obtain the graphics object of the form even though we are not in the Paint event, this done by calling this.CreateGraphics()is is similar to GetDC().
                            
private void MainWnd_Load(object sender, System.EventArgs e)
{ 
    memGraphics.CreateDoubleBuffer(this.CreateGraphics(), this.ClientRectangle.Width, this.ClientRectangle.Height);
}                 
                      
private void MainWnd_Resize(object sender, System.EventArgs e)
{ 
    memGraphics.CreateDoubleBuffer(this.CreateGraphics(), this.ClientRectangle.Width, this.ClientRectangle.Height);
    Invalidate(); // Force a repaint after has been resized 
} 

  • Step 3 - Override the OnPaintBackground is to allow the paint event to render the background.
protected override void OnPaintBackground(PaintEventArgs pevent)
{
}
 
  • Step 4 - Finally implement the Paint event
protected override void Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{

    if (memGraphics.CanDoubleBuffer())
    {
    // Fill in Background (for effieciency only the area that has been clipped)
         memGraphics.g.FillRectangle(new SolidBrush(SystemColors.Window), e.ClipRectangle.X,e.ClipRectangle.Y, e.ClipRectangle.Width, e.ClipRectangle.Height);

        // Do our drawing using memGraphics.g instead e.Graphics
     
        ... Some other code
   
       // Render to the form
        memGraphics.Render(e.Graphics);
    }
}
 

Demonstration Code

The demonstration code show how to implement simple drag and drop interface can achieved using double buffering, it can be used a springbroad for a drag and drop application such as Microsoft Visio.

History

V1.0 Article creation.

License

This article, along with any associated source code and files, is licensed under A Public Domain dedication

About the Author

Norm .net
Software Developer (Senior) Software Kinetics
United Kingdom United Kingdom
Member



Software Kinetics
are experts in developing customised and bespoke applications and have expertise in the development of desktop, mobile and internet applications on Windows.

We specialise in:

  • User Interface Design
  • Desktop Development
  • Windows Phone Development
  • Windows Presentation Framework
  • Windows Forms
  • Windows Communication Framework
  • Windows Services
  • Network Applications
  • Database Applications
  • Web Development
  • Web Services
  • Silverlight
  • ASP.net
 
Visit Software Kinetics

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalit is cool thank you .memberkankankan2226 Dec '12 - 3:51 
QuestionDoubleBuffer [modified]memberjanvb20 Nov '11 - 4:00 
GeneralThank you very muchmemberJoyetta9 Oct '11 - 3:46 
GeneralMy resultsmemberKaiwa7 Apr '10 - 2:36 
GeneralRe: My resultsgroupNorm .net7 Apr '10 - 2:45 
GeneralRe: My resultsmemberKaiwa7 Apr '10 - 6:58 
GeneralGood not perfect but goodmemberCAD Zombie20 Oct '09 - 5:09 
GeneralDrawing an image without flickermemberpcbaby1516 Jul '09 - 15:41 
Generalthis.DoubleBufferedmemberdfsdfsdfoyuti28 Feb '09 - 4:37 
GeneralRe: this.DoubleBufferedmemberNorm .net1 Mar '09 - 20:45 
QuestionCan i use this DBGraphics class for drwaing the controls on my formmemberbhaskar soni5 Jan '09 - 1:27 
QuestionWhat license is the code under?memberbinary12301 Dec '08 - 21:28 
AnswerRe: What license is the code under?memberNorm .net2 Dec '08 - 4:48 
GeneralRe: What license is the code under?memberbinary12302 Dec '08 - 18:30 
GeneralThis is a godsendmemberwalentys2 Aug '08 - 22:45 
GeneralNice job!membersandeepstudd15 Jul '08 - 1:06 
Jokethank u very muchmembersilent200713 Jul '08 - 22:08 
GeneralThanksmemberPALANI KUMAR12 Mar '08 - 23:45 
GeneralCotrolStyle.DoubleBuffermembervadivelkumar5 Jul '07 - 21:26 
QuestionBackgound Objects?memberDoncp7 Dec '06 - 6:43 
AnswerRe: Backgound Objects?memberzhaoxiong198629 Aug '10 - 17:32 
GeneralThanks!memberminity30 Jul '06 - 2:51 
GeneralDrawing....memberzmrcic13 Mar '06 - 3:06 
Generalif ((width != this.width) || (height != this.height))memberMarijn Stevens12 Mar '06 - 12:06 
GeneralRe: if ((width != this.width) || (height != this.height))membersupercali4 Apr '06 - 14:51 
GeneralStill having issuesmemberPonsonby23 Jan '06 - 23:15 
GeneralNice Job!memberjinzhecheng30 Nov '05 - 4:31 
GeneralFlickers worse than before, I must be missing somethingmembersklett2 Oct '05 - 7:23 
GeneralRe: Flickers worse than before, I must be missing somethingmemberjaypea23 Nov '05 - 3:48 
GeneralRe: Flickers worse than before, I must be missing somethingmemberjaypea28 Nov '05 - 5:23 
GeneralRe: Flickers worse than before, I must be missing somethingmemberjaypea28 Nov '05 - 5:24 
GeneralRe: Flickers worse than before, I must be missing somethingmemberLPlateDeveloper7 Oct '08 - 23:15 
GeneralRe: Flickers worse than before, I must be missing somethingmemberdxwnd6 Jan '10 - 18:42 
GeneralThanksmemberidda19 Sep '05 - 22:19 
Generaladded reset methodmembertogil28 Jul '05 - 1:14 
GeneralRe: added reset methodmembernorm.net28 Jul '05 - 1:24 
GeneralRe: added reset methodmemberjmanson19 Dec '05 - 17:03 
GeneralRe: added reset methodmembernorm.net19 Dec '05 - 20:36 
GeneralOn minimize event..memberday13t1 Mar '05 - 22:44 
GeneralRe: On minimize event..memberpphc13 Jun '05 - 16:05 
GeneralRe: On minimize event..membernorm.net19 Sep '05 - 22:36 
GeneralRe: On minimize event..memberChrisWard31 May '07 - 1:19 
GeneralRe: On minimize event..membernorm .net31 May '07 - 1:24 
GeneralVery good piece of code much stronger then double bufferingmemberasherab2 Jan '05 - 21:40 
GeneralA better method (?)memberTeisDraiby15 Oct '04 - 15:35 
GeneralOops!memberTeisDraiby15 Oct '04 - 15:44 
GeneralRe: A better method (!!!)memberBenoit Nesme27 Jan '06 - 0:48 
QuestionCan this be done in VB.NET??memberRichiLloyd28 Sep '04 - 16:16 
AnswerRe: Can this be done in VB.NET??memberRichiLloyd28 Sep '04 - 16:18 
Questionbuggy built in double buffering?membersir_mad5 May '04 - 5:12 

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 29 Jul 2003
Article Copyright 2003 by Norm .net
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid