1
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だけに再描画します。
このサンプルは、スクロールされたビューよりも大きい場合でも、イメージ全体のBitBltを実行します。 OSはそれをクリップしますが、アプリケーションの視点から見ると、BitBltはアップデート矩形以外では意味がありません。 –
あなたは正しいです、サンプルは完全にblitsします。このコード(レコード用の 'CBitmapView :: DoPaint')が可視部分だけをblitするように更新された場合、サンプルは改善され、' CScrollWindowImpl'のより効率的な使用を特徴とします... –