当前位置: 代码迷 >> 综合 >> 虚拟列表控件 CListCtrl
  详细解决方案

虚拟列表控件 CListCtrl

热度:3   发布时间:2023-12-14 20:18:11.0

参考: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  消息