轉(zhuǎn)載自:http://blog.csdn.net/mynamelj/article/details/6571383
自繪控件中經(jīng)常會(huì)遇到閃爍的問(wèn)題,主要原因是某個(gè)區(qū)域發(fā)生了重復(fù)性的繪制而導(dǎo)致的,而列表控件在自繪后閃爍原因是WM_ERASEBKGND消息所導(dǎo)致的。解決定辦法可以將這個(gè)消息屏蔽掉,然后使用雙緩存,在Windows 5.1版本以后可以使用LVS_EX_DOUBLEBUFFER樣式,為了各個(gè)版本的兼容性我個(gè)人不建議使用這個(gè)樣式,因此我們可以攔截WM_PAINT消息來(lái)使用我們自已創(chuàng)建的雙緩存,具體看代碼所示:
1.屏蔽WM_ERASEBKGND消息
BOOL CMyListCtrl::OnEraseBkgnd(CDC * pDC)


{
return FALSE;
} 2.在WM_PAINT消息中使用自已的雙緩存
void CMyListCtrl::OnPaint()


{
CPaintDC dc(this);
CRect rcClient,rcClip,rcHeader;
GetClientRect(&rcClient);
GetHeaderCtrl()->GetWindowRect(&rcHeader);
dc.GetClipBox(&rcClip);
CDC MemDC;
CBitmap MemBitmap, *pOldBitmap;
MemDC.CreateCompatibleDC(&dc);
int nMode = MemDC.SetMapMode(dc.GetMapMode());
MemBitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
pOldBitmap = MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(&rcClient,GetBkColor());
CRgn rgn;
rgn.CreateRectRgn(rcClip.left,rcClip.top,rcClip.right,rcClip.bottom);
MemDC.SelectClipRgn(&rgn);
DefWindowProc(WM_PAINT,(WPARAM)MemDC.m_hDC,(LPARAM)0);
MemDC.SelectClipRgn(NULL);
if (rcClip.top < rcHeader.Height())
rcClip.top = rcHeader.Height();
dc.BitBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),&MemDC,rcClip.left,rcClip.top,SRCCOPY);
MemDC.SetMapMode(nMode);
MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
MemBitmap.DeleteObject();
rgn.DeleteObject();
}