2013-06-10 2 views
0

Я реализовал приложение 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); 
} 

Если пользователь перемещает слайдер большого пальца каждый раз, когда все окно будет перекрашено и начнется мигание.

Есть ли способ избежать мерцания?

Спасибо,

Томас

ответ

1

Поскольку рисунок делается с помощью m_ChartControl, то вы должны называть m_ChartControl.Invalidate(), не обесценивает диалога.

Если у вас есть исходный код для m_ChartControl, см. Эту статью и ее класс CMemDC, чтобы предотвратить мерцание в элементе управления диаграммой.

http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC

+0

Привет ScottMcP-MVP, спасибо за ваш ответ. Я изменил его на m_ChartControl.Invalidate(), и я добавил класс памяти DC из Keith Rule (http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC). И это работает: больше не мерцает. Еще раз спасибо. –

Смежные вопросы