虚拟列表控件 CListCtrl
Posted 王晓斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟列表控件 CListCtrl相关的知识,希望对你有一定的参考价值。
参考:http://fengqing888.blog.163.com/blog/static/3301141620108341333480/
http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/
使用虚拟列表, 添加数据行时不再需要调用控件的inset等函数,更新完内存中的数据后, 调用控件的invalidate() ,设置控件的行数大小,控件通过LVN_GETDISPINFO消息实现控件可见内容的填充,用户在该消息响应函数中完成cell的内容填充, 通过行列索引到内存中的数据中去取得对应的值赋给对应cell的文本即可。
创建CListCtrl 时,设置控件属性 LVS_OWNERDATA(Create时设置), 以启用Visul List功能。
添加消息响应函数(或父窗口中):
void CMyListCtrl::GetDispInfo_M(NMHDR* pNMHDR, LRESULT* pResult);
ON_NOTIFY(LVN_GETDISPINFO, 3, GetDispInfo)
void CMyListCtrl::GetDispInfo_M(NMHDR* pNMHDR, LRESULT* pResult)
// 在此函数中,完成各个rows的celll的值的填充
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
// 当前row的索引值
int nIndex = pItem->iItem;
// 当前column的索引值
int nSubcolumnIndex = pItem->iSubItem;
// 设置各个item的每个cell的值(text 或者 image index)
switch (nSubcolumnIndex )
case 0:
// 设置该cell的文本为 nIndex + 1 的值
wsprintf(pItem->pszText, L"%d", nIndex+1);
break;
case 1,... n:
....
break;
default:
break;
也可以指定 pItem 的图片索引值等,参见上面的参考链接。详细的论述参见第一个链接, 第二个链接中有完整的demo 和 source code。
虚拟列表同样可以进行排序等操作。数据排序完成后直接invalidate即可,注意 内存中数据 与 列表行数索引之间的对应关系。
在列表控件中绘制自定义内容参见消息 NM_CUSTOMDRAW 的处理。
虚拟列表数据更新后必须调用:
SetItemCountEx(nRows);
Invalidate();
更新行数信息,并刷新控件重绘,否则不会响应 LVN_GETDISPINFO 消息。
以上是关于虚拟列表控件 CListCtrl的主要内容,如果未能解决你的问题,请参考以下文章
怎样在MFC中的列表视图控件CListCtrl显示信息?谢谢