(1)CListCtrl改变数据避免闪烁:
法一:直接设置LVS_EX_DOUBLEBUFFER扩展属性。
法二:使用双缓冲。
自定义一个类CMyListCtrl继承CListCtrl,重写OnPaint和OnEraseBkgnd方法
void CMyListCtrl::OnPaint()
{
//使用双缓冲的方法绘制背景
CPaintDC dc(this); // device context for painting
CRect rect;
CRect headerRect;
CDC MenDC; //内存DC
CBitmap MemMap;
GetClientRect(&rect);
//GetDlgItem(0)->GetWindowRect(&headerRect);
this->GetHeaderCtrl()->GetWindowRect(&headerRect);
MenDC.CreateCompatibleDC(&dc);
MemMap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
MenDC.SelectObject(&MemMap);
MenDC.FillSolidRect(&rect, RGB(255, 255, 255));
//调用默认的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();
}
BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return FALSE;
}
(2)CListCtrl插入数据避免闪烁:
在(1)的基础上加上下面代码
CString str;
str.Format(L"%d", nItem);
// plist->LockWindowUpdate();
// plist->SetRedraw(FALSE);
plist->InsertItem(nItem, str);
plist->SetItemText(nItem, 0, str);
plist->SetItemText(nItem, 1, L"地方司法");
// plist->UnlockWindowUpdate();
// plist->SetRedraw(TRUE);
plist->Invalidate(); //很重要,没有这个,有一点点闪
plist->SetScrollPos(SB_VERT, nItem, TRUE); //如果不加这句,滚动条会稍微上下跳动
plist->EnsureVisible(nItem, FALSE);
转载于:https://blog.51cto.com/whatever957/1656965