首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MFC虚拟列表控件中设置ItemData

如何在MFC虚拟列表控件中设置ItemData
EN

Stack Overflow用户
提问于 2018-03-13 06:09:06
回答 1查看 1.2K关注 0票数 4

我有一个所有者描述的MFC CListCtrl,我正试图将其转换为虚拟列表控件。我在列表中有30-40,000个项目,所以虚拟列表控件在速度改进方面做了我需要的事情。问题是我的列表是所有者描述的,我依赖于当前在SetItemData中设置的值来正确地绘制行。

使用虚拟列表控件,您不能调用SetItemData。根据MSDN文档(https://msdn.microsoft.com/en-us/library/ye4z8x58.aspx),LVN_GETDISPINFO通知消息的处理程序应该请求主项目的LVIF_PARAM,但事实并非如此。我仔细阅读了其他有同样问题的(非堆栈溢出)论坛,但似乎没有人知道答案。

在LVN_GETDISPINFO消息中触发LVIF_PARAM的诀窍是什么?

代码语言:javascript
复制
void CTablePage::OnLvnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
  NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
  LV_ITEM* pItem = &(pDispInfo)->item;

  int iItem = pItem->iItem;

  if (pItem->mask & LVIF_TEXT)
  {
    // this gets hit
  }

  if (pItem->mask & LVIF_PARAM) {
    // this never gets hit
  }
}
EN

回答 1

Stack Overflow用户

发布于 2018-03-13 16:40:45

只要您将listcontrol外部数据作为虚拟数据处理,此外部数据结构就可以存储ItemData信息:

代码语言:javascript
复制
typedef struct tagListItem
{
    DWORD dwItemData;
    CString sText;
}ListItem;


CArray<ListItem, ListItem&> m_arrListItem;


void CTablePage::OnLvnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMLVDISPINFO* pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
    LV_ITEM* pItem = &(pDispInfo)->item;

    if (pItem->mask & LVIF_TEXT)
    {
        DWORD dwItemData = m_arrListItem.GetAt(pItem->iItem).dwItemData;
        CString sYourText = m_arrListItem.GetAt(pItem->iItem).sText;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49245184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档