(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);