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

Ton*_*son 6 mfc clistctrl

我有一个所有者绘制的 MFC CListCtrl,我正在尝试将其转换为虚拟列表控件。我的列表中有 30-40,000 个项目,因此虚拟列表控件在速度改进方面完全满足了我的需要。问题是我的列表是所有者绘制的,并且我依靠当前在 SetItemData 中设置的值来正确绘制行。

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

触发LVN_GETDISPINFO消息中的LVIF_PARAM有什么技巧?

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
  }
}
Run Code Online (Sandbox Code Playgroud)

fla*_*iu2 0

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)