1.屏蔽WM_ERASEBKGND消息
BOOL CMyListCtrl::OnEraseBkgnd(CDC
*
pDC)
{
return FALSE;
}
{
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();
}
{
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();
}