(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);
本文出自 “whatever957” 博客,请务必保留此出处http://whatever957.blog.51cto.com/6835003/1656965
原文地址:http://whatever957.blog.51cto.com/6835003/1656965