MFC 虚拟列表控件的使用方法

时间:2022-09-21 19:04:33

 

问题:软件需要从网络上每次获取一个10000byte的数据包,并通过列表实时显示出来。列表有两列,除去表头,有10000行。开始用MFC自带的ListCtrl控件,每次获得10000个的数据显示的时候刷新需要很长时间,显示很慢。

解决方法:使用虚拟列表。

具体步骤:

1.将ListCtrl控件的OwnerData属性从默认的FALSE改为TRUE;(我的理解是为TRUE的话,数据由系统维护而不是列表控件维护,不理解这个也不影响后面的进程);

MFC 虚拟列表控件的使用方法

2.定义一个全局的CString[10000]的数组,当接收数据线程收到一包数据之后,将数据格式化为字符串存入该数组;

3.为ListCtrl控件添加一个CListCtrl类的变量m_list_FBG;

MFC 虚拟列表控件的使用方法

4.为ListCtrl控件添加消息LVN_GETDISPINFO

MFC 虚拟列表控件的使用方法

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.问题成功解决,显示很流畅。