2017-03-18 6 views
1

WTL ScrollWindow効率的な絵

CScrollImpl WM_PAINTは、CPaintDCを派生クラスのOnPaintに渡しません。これは、更新RECT rcPaintメンバを持つPAINTSTRUCT m_psメンバを持ちます。

LRESULT CScrollImpl::OnPaint(UINT, WPARAM wParam, LPARAM, BOOL&) { 
    T* pT = static_cast<T*>(this); 
    ATLASSERT(::IsWindow(pT->m_hWnd)); 
    if(wParam != NULL) { // The HDC is sometimes passed in 
     CDCHandle dc = (HDC)wParam; 
     dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); 
     pT->DoPaint(dc); 
    } 
    else { 
     CPaintDC dc(pT->m_hWnd); 
     dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); 
     pT->DoPaint(CDCHandle(dc)); 
    } 
    return 0; 
} 

は、だから私は、WM_PAINTメッセージを処理してきたし、スクロールしたときに、私がこれまでに達成した最高のは、全体の_MemDCのBitBltですが、unscrolled時に無効化された長方形のBitBltだけに再描画します。

答えて

1

実際には最も効率的かどうかですが、WTLサンプルにはCScrollWindowImplCBitmapViewクラスで使用されるSamples \ BmpViewプロジェクトが含まれています。これは[おそらくは大きい]イメージの表示部分を表示します。具体的には、バックグラウンドの消去およびペイントハンドラを無効にし、要求されたペイントパーツに対してのみBitBltを実行する方法をデモストします。

+0

このサンプルは、スクロールされたビューよりも大きい場合でも、イメージ全体のBitBltを実行します。 OSはそれをクリップしますが、アプリケーションの視点から見ると、BitBltはアップデート矩形以外では意味がありません。 –

+0

あなたは正しいです、サンプルは完全にblitsします。このコード(レコード用の 'CBitmapView :: DoPaint')が可視部分だけをblitするように更新された場合、サンプルは改善され、' CScrollWindowImpl'のより効率的な使用を特徴とします... –