Я реализовал приложение MFC , которое отображает диаграмму. Существуют точки данных (например, 2000), где подмножество из них будет отображаться на диаграмме. Это подмножество должно быть изменено с помощью полосы прокрутки. Поэтому я добавил в свой класс диалога класс CScrollBar
и прослушал событие ON_WM_HSCROLL
, которое вызывает метод OnHScroll
.CScrollBar/MFC: мерцание при перемещении слайдера большого пальца
void CChartWithRealTimeDataDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
UINT nCurrentPos;
nCurrentPos = pScrollBar->GetScrollPos();
// nCurrentPos = m_X_Axis_Scrollbar->GetScrollPos();
bool bDoRepaint = false;
switch (nSBCode)
{
//case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nCurrentPos = nPos;
pScrollBar->SetScrollPos (nPos);
bDoRepaint = true;
break;
case SB_LINELEFT:
nCurrentPos = (UINT)(std::max((int)0, (int)nCurrentPos-1));
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
case SB_LINERIGHT:
nCurrentPos = std::min((UINT)(m_ChartControl.getTotalEnd()), nCurrentPos+1);
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
case SB_PAGELEFT:
nCurrentPos = (UINT)(std::max((int)0, (int)nCurrentPos-10));
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
case SB_PAGERIGHT:
nCurrentPos = std::min((UINT)(m_ChartControl.getTotalEnd()), nCurrentPos+10);
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
}
if (bDoRepaint)
{
m_ChartControl.setShift(nCurrentPos);
Invalidate();
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
Если пользователь перемещает слайдер большого пальца каждый раз, когда все окно будет перекрашено и начнется мигание.
Есть ли способ избежать мерцания?
Спасибо,
Томас
Привет ScottMcP-MVP, спасибо за ваш ответ. Я изменил его на m_ChartControl.Invalidate(), и я добавил класс памяти DC из Keith Rule (http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC). И это работает: больше не мерцает. Еще раз спасибо. –