Как установить ItemData в элемент управления виртуального списка MFC

У меня есть нарисованный владельцем MFC CListCtrl, который я пытаюсь преобразовать в элемент управления виртуальным списком. У меня есть 30-40000 элементов в списке, так что Virtual List Control делает именно то, что мне нужно с точки зрения улучшения скорости. Проблема в том, что мой список нарисован владельцем, и я полагаюсь на значение, которое в настоящее время устанавливается в SetItemData, чтобы иметь возможность правильно нарисовать строку.

С виртуальными элементами управления списком вы не можете вызвать SetItemData. Согласно документации MSDN ( https://msdn.microsoft.com/en-us/library/ye4z8x58.aspx), обработчик уведомляющего сообщения LVN_GETDISPINFO должен запрашивать LVIF_PARAM для основного элемента, но это не так, Я просматривал другие форумы (не-stackru), у которых был такой же вопрос, но никто, кажется, не знает ответа.

Какова хитрость для запуска LVIF_PARAM в сообщении LVN_GETDISPINFO?

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
  }
}

1 ответ

Пока вы обрабатываете внешние данные 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;
    }
}
Другие вопросы по тегам