当列表频繁插入数据时,难免会发生闪烁现象,以下使用的重绘的方式解决闪烁,用到的是双缓冲。
接管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();
}
本文介绍了一种通过双缓冲技术解决列表控件在频繁插入数据时出现闪烁问题的方法。主要通过对WM_ERASEBKGND消息的自定义处理及WM_PAINT消息的重绘实现。

3825

被折叠的 条评论
为什么被折叠?



