我有一个所有者绘制的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
}
}
答案 0 :(得分: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;
}
}