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

Further discussions on flicker free drawing

By , 23 May 2003
 

Introduction

This article aims to show some useful codes for solving flicker problems in CTreeCtrl, CListCtrl and GDI+. And it could be viewed as an extend of Keith Rule's great article "Flicker Free Drawing In MFC".

Background

The only background to this article is that you have read the great article of Keith Rule. Thanks him for his nice code. We will use the class CMemDC proposed by him.

CTreeCtrl

For a CTreeCtrl derived class, if we want to avoid flicker, we could carry out the following steps.

  • Add the file memdc.h in your project.
  • Add the line #include "memdc.h" to stdafx.h or the desired .h file.
  • Add a public CRect variable like CRect m_rectClient;
  • Add a windows message handler for WM_ERASEBKGND, WM_SIZE, and WM_PAINT.

Then we should add the code as following:

BOOL CTreeCtrl::OnEraseBkgnd(CDC* pDC) 
{
    // TODO: Add your message handler code here and/or call default
    UNUSED_ALWAYS(pDC);

    //return CTreeCtrl::OnEraseBkgnd(pDC);
    return TRUE;
}

void CTreeCtrl::OnSize(UINT nType, int cx, int cy) 
{
    CTreeCtrl::OnSize(nType, cx, cy);

    GetClientRect(m_rectClient);
}

void CTreeCtrl::OnPaint() 
{
    CPaintDC dc(this);

    // Paint to a memory device context to reduce screen flicker.
    CMemDC memDC(&dc, &m_rectClient);

    ......

    // Let the window do its default painting...
    CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
}

Then you would get flicker free effect.

CListCtrl

For a CListCtrl derived class, all of the procedures are the same expect the OnSize function should be modified as following to allow the CHeadCtrl (if in report model) to display:

void CListCtrl::OnSize(UINT nType, int cx, int cy) 
{
    CListCtrl::OnSize(nType, cx, cy);

    GetClientRect(m_rectClient);

    CHeaderCtrl* pHC;
    pHC = GetHeaderCtrl();
    if (pHC != NULL)
    {
        CRect rectHeader;
        pHC->GetItemRect( 0, &rectHeader );
        m_rectClient.top += rectHeader.bottom;
    }
}

Then you could get flicker free effect.

GDI+

I have found several articles talking about flicker free drawing in GDI+. However, I want to extend Keith Rule's code to do the same job and avoid to re-implement the double buffer mechanism with CashedBitmap. Thus I use the following method.

  • Add the file memdc.h in your project.
  • Add the line #include "memdc.h" to stdafx.h or the desired .h file.
  • Add a public CRect variable likeCRect m_rectClient; Add a windows message handler for WM_ERASEBKGND, WM_SIZE, and WM_PAINT.

Then we should add the code as following:

BOOL CView::OnEraseBkgnd(CDC* pDC) 
{
    // TODO: Add your message handler code here and/or call default
    UNUSED_ALWAYS(pDC);

    //return CView::OnEraseBkgnd(pDC);
    return TRUE;
}

void CView::OnSize(UINT nType, int cx, int cy) 
{
    CView::OnSize(nType, cx, cy);

    GetClientRect(m_rectClient);
}

void CView::OnPaint() 
{
    CPaintDC dc(this);

    // Paint to a memory device context to reduce screen flicker.
    CMemDC memDC(&dc, &m_rectClient);
    Graphics graphics(memDC);

    ......
}

Then you could get flicker free effect. This method could also do well in CScrollView. Ok, finally, there is still an interesting question left for you: which method will be faster, this method or the double buffer implemented by CashedBitmap?

History

  • Initial release 2003-05-24.

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

About the Author

TeleStar
China China
Member
I am now a faculty in Engineering. But I am also a programmer who use VC from VC1.5 to VC8.0. However, now I prefer to use C# and VB.Net in my job.

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   
GeneralGDI+memberAlex Voronyansky26 Apr '09 - 12:19 
QuestionHow to update listview ONLY when new data is avilable?membermethod0079 May '07 - 14:58 
GeneralWM_PAINTmembermark pinnuck3 Apr '07 - 12:46 
QuestionIneffective methods??memberDouglas R. Keesler29 Dec '06 - 18:54 
GeneralGDI+ with CMemDC slow !memberLord Darius28 May '06 - 1:00 
GeneralRe: GDI+ with CMemDC slow !memberTeleStar6 Sep '06 - 22:33 
QuestionFlickers with WS_EX_LAYOUTRTLmember_Stilgar_30 Mar '06 - 21:16 
AnswerRe: Flickers with WS_EX_LAYOUTRTLmemberTeleStar6 Sep '06 - 22:27 
Generalwhere is the original articlememberivan françois17 Jan '06 - 7:17 
Generalhttp://www.codeproject.com/gdi/flickerfree.aspmemberTeleStar27 Jan '06 - 13:06 
QuestionHow to use in a dialog-based app?memberHawks22 Aug '05 - 7:52 
Answerwhy need to use CMemDC in a dialog-based app?memberTeleStar22 Aug '05 - 18:03 
GeneralBetter code for CTreeCtrlsussAdam Tegen16 Aug '04 - 6:12 
GeneralBetter code for CListCtrlsussAdam Tegen16 Aug '04 - 5:59 
Generalyou are right, and I think that's what they do in BCG and XTPromemberAI200417 Aug '04 - 6:44 
GeneralRe: Better code for CListCtrlsussAnonymous4 Mar '05 - 11:18 
GeneralAwesoma powa!:)memberabloy25 Aug '07 - 4:01 
GeneralStop Flicker AlternativememberC@ssidy15 Apr '09 - 5:09 
QuestionReduce flicker in ListView ?member_skidrow_vn_11 Nov '03 - 7:34 
AnswerRe: Reduce flicker in ListView ?memberxxxyyyzzz1 Dec '03 - 20:01 
AnswerRe: Reduce flicker in ListView ?memberEndemoniada24 Mar '04 - 15:49 
GeneralIf you use SetRedraw(),memberxxxyyyzzz26 Mar '04 - 10:38 
GeneralPossible to use with owner draw List Controlmembertlee4 Nov '03 - 10:17 
GeneralRe: Possible to use with owner draw List Controlmemberxxxyyyzzz4 Nov '03 - 11:32 
GeneralRe: Possible to use with owner draw List Controlmembertlee4 Nov '03 - 12:10 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130523.1 | Last Updated 24 May 2003
Article Copyright 2003 by TeleStar
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid