CScrollBar / MFC:移动拇指滑块时闪烁

时间:2013-06-10 13:25:21

标签: c++ mfc

我实施了一个显示图表的 MFC应用程序。存在数据点(例如2000),其中它们的子集将显示在图表中。必须使用滚动条更改此子集。所以我在对话框类中添加了CScrollBar类,并听取调用ON_WM_HSCROLL方法的OnHScroll事件。

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 个答案:

答案 0 :(得分:1)

由于绘图是由m_ChartControl完成的,所以你应该调用m_ChartControl.Invalidate(),而不是对话框的Invalidate。

如果您有m_ChartControl的源代码,请参阅本文及其类CMemDC,以防止在图表控件中出现闪烁。

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