使用LVS_OWNERDATA CListCtrl,其列数多于屏幕上可见的列数,如何优化LVN_GETDISPINFO回调以尽可能少地处理当前不可见的列(子项),因为它们是从左侧滚动或右边缘?
如果没有使用OwnerDraw,我可以阻止框架为不在屏幕上的列调用LVN_GETDISPINFO吗?
在LVN_GETDISPINFO或LVN_ODCACHEHINT回调中计算哪些列(子项)可见的最佳方法是什么?
答案 0 :(得分:2)
不,您无法阻止ListView请求非可视列的数据。但您可以使用LVM_GETSUBITEMRECT
来确定给定的子项是否超出了ListView可见客户区的范围。
答案 1 :(得分:0)
检查LVN_GETDISPINFO中iSubitem的列标题项矩形,并与滚动位置进行比较以跳过不可见列的工作
// In LVN_GETDISPINFO handler...
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
if (pDispInfo->item.mask & LVIF_TEXT) {
CRect myListRect, headerRect;
myList.GetClientRect(&myListRect);
myList.GetHeaderCtrl()->GetItemRect(pDispInfo->item.iSubitem,&headerRect);
int hScrollPos = myList.GetScrollPos(SB_HORIZ);
if(headerRect.right < hScrollPos || headerRect.left > hScrollPos + myListRect.right) {
strcpy_s(pDispInfo->item.pszText,pDispInfo->item.cchTextMax,"");
*pResult = 0;
return;
}
// else, build response string
}