Stopping flicker during updates | CodeGuru

Stopping flicker during updates

When making major changes to a list control (and other controls) it is a good idea to turn off updating of the control. To do this you would use SetRedraw(false) at the start of the change and SetRedraw(true) at the end, and then invalidate the control. However, SetRedraw simply turns redraw on or off, it […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 6, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

When making major changes to a list control (and other controls) it is a
good idea to turn off updating of the control. To do this you would use
SetRedraw(false) at the start of the change and SetRedraw(true) at the end,
and then invalidate the control.

However, SetRedraw simply turns redraw on or off, it does not let you know
whether or not redraw was on or off before the call. And there is no
function that can tell you this.

For this reason, I have my own SetRedraw function that counts the number of
times you have turned it on and turned it off.

Define a member variable:

     int m_redrawcount;

In your contructor do:

     m_redrawcount = 0;

And then define the following function (in this case for a list control):

void CMyListCtrl::SetRedraw( BOOL bRedraw) {
     if (! bRedraw) {
          if (m_redrawcount++ <= 0) {
               CListCtrl::SetRedraw(false);
          }
     } else {
          if (--m_redrawcount <= 0) {
               CListCtrl::SetRedraw(true);
               m_redrawcount = 0;
               Invalidate();
          }
     }
}

The first time you turn redraw off, the real SetRedraw function is called
to turn redrawing off. Subsequently the function increases a counter when
you requested redraw be turned off, and decreases it when you request
redraw to be turned on again. When the counter gets back down to zero, the
real SetRedraw function is called to turn redrawing back on again and the
control is invalidated (so that redrawing actually takes place).

This means you can not put SetRedraw(false) at the start of, and
SetRedraw(true) and the end of, any function that makes large changes to
the lsit control (like loading, sorting, changing with column widths or
order etc).

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.