0

グラフを表示するMFC アプリケーションを実装しました。それらのサブセットがチャートに表示されるデータ ポイント (2000 など) があります。このサブセットは、スクロール バーで変更する必要があります。そこで、ダイアログ クラスにクラスを追加し、メソッドを呼び出すイベントをCScrollBarリッスンしました。ON_WM_HSCROLLOnHScroll

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);
}

ユーザーがサム スライダーを動かすたびにウィンドウ全体が再描画され、ちらつきが始まります。

ちらつきを避ける方法はありますか?

ありがとう、

トーマス

4

1 に答える 1

1

描画は m_ChartControl によって行われるため、ダイアログの Invalidate ではなく、m_ChartControl.Invalidate() を呼び出す必要があります。

m_ChartControl のソース コードがある場合は、この記事とそのクラス CMemDC を参照して、チャート コントロールのちらつきを防止してください。

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

于 2013-06-10T13:49:01.243 に答える