您的位置:首页 > 其它

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

2014-07-07 20:37 1811 查看
问题:软件需要从网络上每次获取一个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.问题成功解决,显示很流畅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: