Click here to Skip to main content
15,903,012 members
Articles / Multimedia / GDI
Article

Flicker free drawing without using double buffer

Rate me:
Please Sign up or sign in to vote.
1.17/5 (20 votes)
6 Sep 2008CPOL 32.7K   689   18   2
Flicker free drawing without using double buffer
Image 1

Introduction

This article discuss how to flicker free drawing but not using double buffer.

Explanation

The picture shows a window,drawing 4 overlapped rects,and always stay at right-bottom corner.without using double buffer,when resize the window,it flickers.
Here is the drawing order(in normal way):
do.gif
every draw action is covered prev drawing,so it flickers,because there is overlapped part.If we can draw with no overlap part,reverse the drawing order like this:
dv.gif
there is no overlapped part,so it will never flicker.but how can we draw an none-rect part?use the function ExcludeClipRect,draw a rect,call ExcludeClipRect to exclude this rect,so next draw will not cover this area,so there is no overlapped part and will not flicker.

Using the code

First,in WM_ERASEBKGND,just return TRUE.then in WM_PAINT:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    RECT rc,rcDraw;

    GetClientRect(hwnd,&rc);
    BeginPaint(hwnd,&ps);

    for(int i=0;i<4;i++)
    {
        rcDraw.left = rc.right - 200 - 50*i;
        rcDraw.right = rc.right - 50*i;
        rcDraw.top = rc.bottom - 200 - 50*i;
        rcDraw.bottom = rc.bottom - 50*i;
        FillRect(ps.hdc,&rcDraw,g_brushRect[i]);
        ExcludeClipRect(ps.hdc,rcDraw.left,rcDraw.top,rcDraw.right,rcDraw.bottom);
    }
    FillRect(ps.hdc,&rc,g_brushBkg);
    EndPaint(hwnd,&ps);
    return 0;
}

Each time you draw a rect,call ExcludeClipRect to exclude this rect area for drawing,at last,draw the background,and it's flicker free.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
China China
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 1 Pin
etking007200430-Dec-08 16:10
etking007200430-Dec-08 16:10 
GeneralPoor Research PinPopular
Vitaly Tomilov6-Sep-08 14:29
Vitaly Tomilov6-Sep-08 14:29 
Quote: "...it flickers, because there is overlapped part".

It appears you don't even know what's causing the flickering Smile | :)

Flickering is caused by the fact that drawing directly into the screen is way slower than into memory because too much data is processed over and over again on each level between all filters from the application to the graphic-rendering engine, and that happens on every change made on the screen.

This is why double buffering is necessary, because it summarizes the complete sequence of drawing into one single bitmap output that goes into the screen. There are a few methods for optimizing double buffering, but it remains to be essential for most tasks.

At least 99% of drawing is way more complex than just some rectangles, so the example is really no good either, it's not practical.

Back to the square one, mate, try to understand the essence of drawing via double buffering, so then you will see that your method is no substitute for it at all.

Plus, an article like this should be a little deeper into math, i'd say, calculating the real optimization, because numbers are important here, and which you didn't do either.

Regards,
Vitaly

Professional System Library on www.prosyslib.org

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.