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。明显上升。