CListCtrl改变数据和插入数据避免闪烁的方法


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


你可能感兴趣的:(插入数据,闪烁,避免,CListCtrl,修改数据)