Last Updated 2004/06/08
Programming Tips Visual C++ MFC CView  索 引 
擬似アニメーションのちらつき防止法
2004/06/08

擬似アニメーションなどは OnTimer() などで画面描画を更新することとなる.
(擬似アニメーションに限らずロギングなどのソフトはそのような処理になることが多い)
OnTiemr() の中で
Invalidate(TRUE);
などとやってしまうと,全画面を更新するので画面がちらつくこととなる.
OnTimer() の中では無効になる矩形を計算して InvaridateRect() として,OnDraw() にて,GetClipBox() するとちらつきはかなり減らすことができる.

また,CreateCompatibleDC() などを使用して裏画面を用意してそれを転送するようにするとちらつきをおさえることができる.この場合 OnTimer() の中では
Invalidate(FALSE);
とする.

int CFooView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    CClientDC dc(this);
    m_dcBuffer.CreateCompatibleDC( &dc );
    m_bmpBuffer.CreateCompatibleBitmap( &dc, 1024,768 );
    m_dcBuffer.SelectObject( &m_bmpBuffer );

    SetTimer(1,100,NULL);
    return 0;
}


void CFooView::OnTimer(UINT nIDEvent) {

    Invalidate(FALSE);

    CView::OnTimer(nIDEvent);
}


void CFooView::OnDraw(CDC* pDC)
{
    CBallsDoc* pDoc = GetDocument();

    // 裏画面への描画など

    // バッファを画面に転送
    pDC->BitBlt( 0, 0, 1024, 768, &m_dcBuffer, 0, 0, SRCCOPY );
}



また,描画を抑制する方法としては,UpdateAllViews() の呼び出しを以下の様にする方法もある.

    pDoc->UpdateAllViews(NULL,
                         HINT_DRAW          // 画面バッファに描画
                       | HINT_INVALIDATE    // 画面を無効化
                       | HINT_REFRESH,      // バッファから画面に転送
                         NULL);


参照
前後のTips
擬似アニメーションのちらつき防止法

DSS ProgrammingTipsCGI Ver2.02