[转MSDN]虚拟列表(MFC)
来源:互联网 发布:帝国cms定时审核 编辑:程序博客网 时间:2024/06/05 14:14
虚拟列表控件指具有 LVS_OWNERDATA 样式的列表视图 (ListView) 控件。该样式启用控件来支持项数达到 DWORD(默认的项数只扩展到 int)。然而,该样式的最大便利是可以使内存中一次只有一个数据项子集。这使虚拟列表视图 (ListView) 控件可以将自己借给大型信息数据库使用,而在这类数据库中已存在特定的数据访问方法。
注意 MFC 除了在CListCtrl 中提供虚拟列表功能外,还在 CListView 类中提供相同的功能。
在开发虚拟列表控件时应注意一些兼容性问题。有关更多信息,请参见 Platform SDK 中“列表-视图控件”主题的“兼容性问题”一节。
处理 LVN_GETDISPINFO 通知
虚拟列表控件维护非常少的项信息。除了项选择和焦点信息,所有项信息都由控件的所有者管理。框架通过 LVN_GETDISPINFO 通知消息来请求信息。若要提供请求的信息,虚拟列表控件的所有者(或控件本身)必须处理该通知。使用“属性”窗口可以很容易地完成此操作(请参见将消息映射到函数)。所得到的代码应类似于下面的示例(其中CMyListCtrl
是虚拟列表控件对象,控件正在处理通知)。
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)END_MESSAGE_MAP()
在 LVN_GETDISPINFO 通知消息的处理程序中,必须检查正在请求的信息的类型。可能值是:
- LVIF_TEXT 必须填写 pszText 成员。
- LVIF_IMAGE 必须填写 iImage 成员。
- LVIF_INDENT 必须填写 iIndent 成员。
- LVIF_PARAM 必须填写 lParam 成员。
- LVIF_STATE 必须填写 state 成员。
然后应将所有请求的信息提供给框架。
下面的示例摘自列表控件 (List Control) 对象的通知处理程序体,它通过为文本缓冲区和项的图像提供信息来说明一种可能的方法:
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;LV_ITEM* pItem= &(pDispInfo)->item;int iItemIndx= pItem->iItem;if (pItem->mask & LVIF_TEXT) //valid text buffer?{ switch(pItem->iSubItem){ case 0: //fill in main text lstrcpy(pItem->pszText, m_Items[iItemIndx].m_strItemText); break; case 1: //fill in sub item 1 text lstrcpy(pItem->pszText, m_Items[iItemIndx].m_strSubItem1Text); break; case 2: //fill in sub item 2 text lstrcpy(pItem->pszText, m_Items[iItemIndx].m_strSubItem2Text); break; }}if pItem->mask & LVIF_IMAGE) //valid image? pItem->iImage= m_Items[iItemIndx].m_iImageIndex;
缓存和虚拟列表控件
由于这种类型的列表控件 (List Control) 是提供给大的数据集的,因此建议您缓存请求的项数据以提高检索性能。框架提供缓存提示机制,通过发送 LVN_ODCACHEHINT 通知消息来帮助优化缓存。但是,您必须使用一种稍有不同的方法来处理该通知。使用“属性”窗口,重写列表控件 (List Control) 对象的OnChildNotify 函数。在该示例的情况下为CMyListCtrl
。
在处理程序体中检查 LVN_ODCACHEHINT 消息,如果找到,则准备缓存。
下面的示例(摘自 OnChildNotify
函数体)执行此检查并调用CMyListCtrl
类的PrepCache
成员函数。
NMLVCACHEHINT* pcachehint=NULL;if (message == WM_NOTIFY) { NMHDR* phdr = (NMHDR*)lParam; switch(phdr->code) { case LVN_ODCACHEHINT: pcachehint= (NMLVCACHEHINT*) phdr;// Load the cache with the recommended range. PrepCache(pcachehint->iFrom, pcachehint->iTo); break; default: return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult); } return FALSE; } else return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);
注意,如果消息类型不是 LVN_ODCACHEHINT,则通知将传递给基类 (CListCtrl)。有关准备和维护缓存的更多信息,请参见 Platform SDK 中的“列表-视图控件”主题的“缓存管理”一节。
查找特定的项
当需要查找特定的列表控件项时,虚拟列表控件发送 LVN_ODFINDITEM 通知消息。列表视图 (ListView) 控件接收快捷键访问或接收LVM_FINDITEM 消息时发送该通知消息。搜索信息以LVFINDINFO 结构的格式发送,该结构是NMLVFINDITEM 结构的成员。通过重写列表控件 (List Control) 对象的OnChildNotify 函数来处理该消息,并在处理程序体中检查LVN_ODFINDITEM 消息。如果找到此消息,则执行相应的操作。
您应该准备好搜索与列表视图 (ListView) 控件给定的信息匹配的项。如果成功,则应返回项的索引;如果没有找到匹配项,则返回 -1。
请参见
使用 CListCtrl |Windows 公共控件和 MFC 类
- [转MSDN]虚拟列表(MFC)
- MFC数据类型(from MSDN)
- MFC中常用的虚拟键位列表
- MFC 虚拟列表控件的使用方法
- 【转】虚拟列表
- MFC的CListCtrl改造给虚拟列表使用
- c#中的虚拟方法-virtual(转自MSDN)
- 虚拟列表控件(CListCtrl)
- 虚拟列表控件(CListCtrl)
- 虚拟列表控件(CListCtrl)
- 虚拟列表控件(CListCtrl)
- [转载]MFC键盘事件虚拟码(转)
- 虚拟列表
- 虚拟列表
- 虚拟列表
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- 虚拟列表(virtual list control)
- 使用 jsoup 对 HTML 文档进行解析和操作
- SurfaceView 清屏
- Struts2+Android 使用struts2制作做webservice
- 关于 com.android.vending.INSTALL_REFERRER _ google analytics
- 学习Swing的一些经验
- [转MSDN]虚拟列表(MFC)
- 【java】java二进制,字节数组,字符,十六进制,BCD编码转换收藏
- linphone源码分析----初始化部分
- 在VC++6.0下构建可直接编辑的列表控件类
- C语言系统资源控制(getrlimit && setrlimit)
- 设计模式之01单例模式(笔记)
- CTreeView说明
- Sphere/sector 深度剖析之一
- 使用java vuser来实现mysql的执行过程