I'm dealing with a very weird visual bug. Let me explain.
I have a C++/MFC application that displays a count in a window:
The count (text) is displayed via a CStatic
control. The mechanism is very simple. I call it every 1000 ms and update the text as such:
void CTestCountdownFlickerDlg::RedrawCounter(LPCTSTR pText)
{
CStatic* pTxtBox = (CStatic*)this->GetDlgItem(IDC_STATIC_COUNTER);
ASSERT(pTxtBox);
//Get previous text
CString strPrevText;
pTxtBox->GetWindowText(strPrevText);
//Update only if different
if(strPrevText.Compare(pText) != 0)
{
//Set next text
pTxtBox->SetWindowText(pText);
}
}
What happens is that the CStatic
control updates without any issues on the OS with visual themes enabled, but if I run it on the OS with the Windows Classic theme (for instance, the screenshot above is from Windows 7) the CStatic
control produces a visible flicker every time it updates the text.
Well, I understand that I'm nitpicking here, still I would really like to get rid of this flicker.
Here's what I tried:
In my actual project I tried subclassing the
CStatic
control and removed the processing ofWM_ERASEBACKGROUND
by simply returning 1. That didn't help.In the same subclass for
CStatic
control I tried to overrideWM_PAINT
, but that didn't work at all. So I'm not sure if I'm going too far with it at this point.
Here's the C++/MFC source code for my test project I made the screenshot above for.