作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个所有者绘制的 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
}
}
最佳答案
只要你将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;
}
}
关于mfc - 如何在 MFC 虚拟列表控件中设置 ItemData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245184/
我是一名优秀的程序员,十分优秀!