Click here to Skip to main content
Licence CPOL
First Posted 13 Jun 2002
Views 98,848
Downloads 1,740
Bookmarked 30 times

Do a flicker-free drawing using MFC methods

By | 13 Jun 2002 | Article
How to achieve flicker-free drawing when using the methods MFC provides

Introduction

I am quite new to VC++, and I found MFC support of drawing is quite easy to use at first. Just a few lines of code, and you can draw whatever basic shapes on the client area. But when it comes to flicker-free, I had a tough time to dig out the working sequence. Thanks to all CPians, especially Chris Losinger, Joaquín M López Muñoz, Tim Smith, Shog, Nish, Ernest Laurentin, Kemal OZLU, Ravi Bhavnani, vaithsr, for helping me out in my painful days. And I'd like to share what I have learnt so far with other newbies.

Three messages you need to handle

  • First of all, in order to get flicker-free drawing, you need to draw everything on a memory DC, then BitBlt it to the real DC. This is called double buffering, and it is addressed in many books and articles.
  • Secondly, you need to overwrite OnEraseBkgnd to really get rid of flickering.
  • Last but not least, you still want the background to be erased when WM_ERASEBKGND is sent by other event than your InvalidateRect( &rect_yourDrawArea ). So you need to overwrite the handler of WM_NCPAINT, to clear the flag of bypassing OnEraseBkgnd, so that the background will be paint properly.

Some tricks

Some tricks to achieve flicker-free while avoiding side effects are:

  1. When draw your picture on the memory DC, you can assume a rectangle, whose left top corner is at (0,0). Then when you BitBlt it to the real DC, you can specify the real left top corner by x and y argument. In this way, you can move your drawing area easily in the future, since the only place needs to be changed is BitBlt's x and y argument.
  2. Whenever you are updating your drawing by calling InvalidateRect(&rect_yourDrawArea), set the flag so that OnEraseBkgnd will be bypassed. And at the end of OnPaint, clear the flag, so that the background will be erased in other cases.
  3. When the frame is resized, or scroll bar is dragged, or window is reactivated, WM_NCPAINT will always be sent to your program. This is the case that you would clear your EraseBkgnd flag, so that the background will be erased, instead of giving you a see-through client area.

End

The detail is in the source code. Since it is quite self-explanatory, I won't waste my breath here. I hope you find this article useful. Thanks for reading.

License

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

About the Author

lucy

Software Developer

Canada Canada

Member

I love this place!

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

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Questionwhat to do if MapMode is HIMETRIC? Pinmembermikel_mike3313:27 26 Jul '09  
GeneralThanks Pinmemberinvader1111:27 7 Dec '08  
GeneralThanks for this article PinmemberBryanInTokyo18:51 9 Aug '05  
I always wondered how to make simple animations, your article was so helpful, thank you!
GeneralI am looking for a simple MFC Control with Draw Area Pinmemberp2002ad6:38 25 May '05  
GeneralUnable to pass CDC* to another function PinsussC++Rules8:06 20 Sep '03  
GeneralThanks PinmemberMoak5:24 19 Feb '03  
GeneralSimple and to the Point PinmemberJEWeaver5:30 7 Nov '02  
Generalpicture... PinmemberMario M.1:01 16 Jun '02  
GeneralRe: picture... Pinmemberlucy3:58 16 Jun '02  
GeneralRe: picture... PinmemberShog94:22 16 Jun '02  
General说实话,您的文章实在没您本人亮丽 PinmemberAnonymous4:46 16 Jun '02  
GeneralSuck guys PinmemberMyronLi23:47 9 Sep '07  
General咳! 太可惜了 Pinmember金牌王老五2:21 15 Jun '02  
GeneralRe: 咳! 太可惜了 PinmemberAnonymous13:24 15 Jun '02  
GeneralWooo PinmemberAny11:16 14 Jun '02  
General... PinmemberMario M.10:58 14 Jun '02  
GeneralRe: ... Pinmemberlucy11:10 14 Jun '02  
GeneralRe: ... PinmemberBrit13:21 14 Jun '02  
GeneralRe: ... PinmemberMario M.14:41 14 Jun '02  
GeneralRe: ... PinsussAnonymous20:58 18 Jul '02  

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120528.1 | Last Updated 14 Jun 2002
Article Copyright 2002 by lucy
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid