虚拟列表控件 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列表控件 CListCtr

怎样在MFC中的列表视图控件CListCtrl显示信息?谢谢

CListCtrl (MFC) 选择点击通过控制UNDERNEATH列表

CListCtrl

列表控件

MFC中CListCtrl控件怎样获取某列的列号