CListCtrlシンチレーションの問題の解決
1113 ワード
リストに頻繁にデータが挿入されると、シンチレーションが発生するのは避けられません.以下では、シンチレーションを解決するために再描画を使用します.デュアルバッファを使用します.
引き継ぎWM_ERASEBKGNDメッセージは、デフォルトの処理を削除し、処理しないに変更するとfalseに戻ります.
処理WM_PAINTメッセージ、自己描画を実現
引き継ぎWM_ERASEBKGNDメッセージは、デフォルトの処理を削除し、処理しないに変更するとfalseに戻ります.
BOOL CListCtrlEx::OnEraseBkgnd(CDC* pDC)
{
// WM_ERASEBKGND
return false;
//
//return CListCtrl::OnEraseBkgnd(pDC);
}
処理WM_PAINTメッセージ、自己描画を実現
void CListCtrlEx::OnPaint()
{
// WM_PAINT
CPaintDC dc(this); // device context for painting
CRect rect;
CRect headerRect;
CDC MenDC;// ID
CBitmap MemMap;
GetClientRect(&rect);
GetDlgItem(0)->GetWindowRect(&headerRect);
MenDC.CreateCompatibleDC(&dc);
MemMap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
MenDC.SelectObject(&MemMap);
MenDC.FillSolidRect(&rect,RGB(228,236,243));
// OnPaint(), DC
DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0);
//
dc.BitBlt(0,headerRect.Height(),rect.Width(), rect.Height(),&MenDC,0, headerRect.Height(),SRCCOPY);
MenDC.DeleteDC();
MemMap.DeleteObject();
}