MFC虚拟列表使用详解

MFC虚拟列表使用详解

在列表中显示大量数据时,比InsertItem操作更快。
mfc基本对话框工程建立后,添加list_control控件,并设置属性(必须)在这里插入图片描述

我这里使用样式为
在这里插入图片描述

为列表控件添加变量(m_listcontrol)

参考各种帖子的做法,添加一个继承CObject的类,命名为CLabelItem。
在CLabelItem类中重载 操作符=,和构造函数。
MFC虚拟列表使用详解_第1张图片

CLabelItem(const CLabelItem& ci);
const CLabelItem& operator=(const CLabelItem& stringSrc);

为list_control添加消息(LVN_GETDISPINFO)处理函数
消息处理函数如

void Cobj_show_extra_windowsDlg::OnLvnGetdispinfoListSelf(NMHDR *pNMHDR, LRESULT *pResult)
{
	//NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 
	LV_ITEM* pItem= &(pDispInfo)->item; 
	/*m_arLabels_self 在头文件中定义  CArray  m_arLabels_self*/
	CLabelItem rLabel = m_arLabels_self.ElementAt(pItem->iItem); 
	if (pItem->mask & LVIF_TEXT) //valid text buffer?
	{  
		CString msg;
		switch (pItem->iSubItem)
		{
		case 0:	//第0列			
			break;
		case 1:	//第1列	
			lstrcpy(pItem->pszText, rLabel.obj_csOrigin);
			break;
		default:
			break;
		}

	}
}

添加数据

	UpdateData(TRUE);
	// TODO: 在此添加控件通知处理程序代码
	char * pszCols[]={"xx", "xx", "xx", "xx", "xx", "xx", "xx", "xx", "xx"};
	CString strText;
	int i;
	LVCOLUMN	Col;
	Col.mask= LVCF_TEXT;
	for(i=0; i<9; i++)
	{
		strText= CString(pszCols[i]);
		Col.pszText=strText.GetBuffer(strText.GetLength()+1);
		Col.cchTextMax=strText.GetLength()+1;
		myFirstDlg->m_listcontrol.SetColumn(i, &Col);
		strText.ReleaseBuffer();
	}
	 
	m_arLabels_self.RemoveAll();
	m_arLabels_self.SetSize(1000, 2);

	CLabelItem Label;
	for(i=0; i<90; i++)
	{
		Label.obj_iNumber		= 10;
		....	//CLabelItem 成员变量赋值
		m_arLabels_self.SetAtGrow(i, Label);
	}
	m_listcontrol_self.SetItemCount(i);
	m_listcontrol_self.Invalidate();//通知列表数据已经准备好,可以更新显示

(cpu:i7-7700k,ram:16g)
测试时,当列表只有两列时,填充500行大约需要4ms。当列数增加9列,填充500行,时间到达30-40ms。明显上升。

你可能感兴趣的:(MFC)