Click here to Skip to main content
15,889,714 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 

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.