Stopping flicker during updates
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).

Comments