问题:软件需要从网络上每次获取一个10000byte的数据包,并通过列表实时显示出来。列表有两列,除去表头,有10000行。开始用MFC自带的ListCtrl控件,每次获得10000个的数据显示的时候刷新需要很长时间,显示很慢。
解决方法:使用虚拟列表。
具体步骤:
1.将ListCtrl控件的OwnerData属性从默认的FALSE改为TRUE;(我的理解是为TRUE的话,数据由系统维护而不是列表控件维护,不理解这个也不影响后面的进程);
2.定义一个全局的CString[10000]的数组,当接收数据线程收到一包数据之后,将数据格式化为字符串存入该数组;
3.为ListCtrl控件添加一个CListCtrl类的变量m_list_FBG;
4.为ListCtrl控件添加消息LVN_GETDISPINFO
5.编辑LVN_GETDISPINFO消息响应函数
void CDialogFirstPage::OnLvnGetdispinfoList(NMHDR *pNMHDR, LRESULT *pResult)
{
//NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
int iItemIndx= pItem->iItem;//获取行号,会自动根据当前显示区的行数,更新所有的行
if( pItem->mask&LVIF_TEXT ) {//字符串缓冲区有效
CString temp;
switch( pItem->iSubItem //列号) {
case 0:
temp.Format(_T("FBG%d"),m_tList[iItemIndx].idex);
lstrcpy( pItem->pszText,temp);
break;
case 1:
lstrcpy( pItem->pszText, m_tList[iItemIndx].value);
break;
//case 2:
//lstrcpy( pItem->pszText, m_tlist[iItemIndx].description );
}
}
m_list_FBG.SetItemCountEx(10000);
m_list_FBG.Invalidate();//此处表示每更新一行,就把列表设为无效,然后列表就会重绘,可以根据显示的要求,将这句放在定时器的响应函数里响应
}
5.问题成功解决,显示很流畅。