Рисование элемента управления списком по умолчанию довольно некорректно. Но есть простой способ реализовать свою собственную технику двойной буферизации:
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, если добавите переменную-член для растрового изображения и только (заново) создадите ее, когда размер окна изменился (поскольку всегда создание растрового изображения может быть дорогостоящим в зависимости от размера окна).
Это должно работать очень хорошо.