Как установить 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;
}
}