デフォルトのリストコントロールの描画にはかなり欠陥があります。ただし、独自のダブルバッファリング手法を実装するための簡単なトリックがあります。
CMyListCtrl::OnPaint()
{
CRect rcClient;
GetClientRect(rcClient);
CPaintDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmMem;
bmMem.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CBitmap* pbmOld = dcMem.SelectObject(&bmMem);
dcMem.FillSolidRect(rcClient, ::GetSysColor(COLOR_WINDOW));
this->DefWindowProc(WM_PAINT, (WPARAM)dcMem.m_hDC, (LPARAM)0);
dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pbmOld);
CHeaderCtrl* pCtrl = this->GetHeaderCtrl();
if (::IsWindow(pCtrl->GetSafeHWnd())
{
CRect aHeaderRect;
pCtrl->GetClientRect(&aHeaderRect);
pCtrl->RedrawWindow(&aHeaderRect);
}
}
これにより、ビットマップが作成され、デフォルトのウィンドウプロシージャが呼び出されて、リストコントロールがビットマップにペイントされ、ビットマップのコンテンツがペイントDCにブリットされます。
WM_ERASEBKGNDのハンドラーも追加する必要があります。
BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
これにより、コントロールが再描画の前に常に背景を消去するのを停止します。ビットマップのメンバー変数を追加し、ウィンドウのサイズが変更された場合にのみ(再)作成すると、OnPaintをさらに最適化できます(ウィンドウのサイズによっては、常にビットマップの作成にコストがかかる可能性があるため)。
これはかなりうまくいくはずです。