MFC虚拟列表使用详解

MFC虚拟列表使用详解

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

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

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

参考各种帖子的做法,添加一个继承CObject的类,命名为CLabelItem。
在CLabelItem类中重载 操作符=,和构造函数。
在这里插入图片描述

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<NMLVDISPINFO*>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 
	LV_ITEM* pItem= &(pDispInfo)->item; 
	/*m_arLabels_self 在头文件中定义  CArray <CLabelItem,CLabelItem> 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。明显上升。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC 中的虚拟列表Virtual List)是一种特殊的列表控件,它可以处理大量数据并提高列表的效率和性能。与普通的列表控件不同,虚拟列表只在需要显示时才加载数据,而不是在初始化时就全部加载。这样可以减少内存占用和提高响应速度,特别适合处理大量数据的场景。 在 MFC 中,可以通过 CListCtrl 类的 SetItemCount() 方法设置列表的项数,然后使用 OnGetDispInfo() 方法来获取需要显示的数据。具体步骤如下: 1. 创建虚拟列表控件,并将其风格设置为`LVS_OWNERDATA`。 2. 在初始化过程中,使用`SetItemCount()`方法设置列表的项数,该方法会触发`OnGetDispInfo()`方法。 3. 在`OnGetDispInfo()`方法中,根据需要显示的项和列,获取相应的数据并设置到`LVITEM`结构体中。 4. 在需要更新列表时,调用`Invalidate()`方法强制刷新列表。 下面是示例代码: ```c++ // 设置列表项数 m_listCtrl.SetItemCount(nCount); // 获取需要显示的数据 void CMyDlg::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) { NMLVDISPINFO* pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); LVITEM& item = pDispInfo->item; // 获取需要显示的数据,并设置到 LVITEM 结构体中 item.mask = LVIF_TEXT; item.iItem = pDispInfo->item.iItem; item.iSubItem = pDispInfo->item.iSubItem; item.pszText = "Data to display"; *pResult = 0; } // 更新列表 m_listCtrl.Invalidate(); ``` 需要注意的是,虚拟列表使用需要结合具体的业务场景和数据量来评估和优化性能。在处理大量数据时,可以采用分页、延迟加载等技术来提高效率和响应速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值