如何针对不可见列优化CListCtrl LVN_GETDISPINFO?

时间:2014-10-20 23:15:59

标签: listview winapi mfc

使用LVS_OWNERDATA CListCtrl,其列数多于屏幕上可见的列数,如何优化LVN_GETDISPINFO回调以尽可能少地处理当前不可见的列(子项),因为它们是从左侧滚动或右边缘?

如果没有使用OwnerDraw,我可以阻止框架为不在屏幕上的列调用LVN_GETDISPINFO吗?

在LVN_GETDISPINFO或LVN_ODCACHEHINT回调中计算哪些列(子项)可见的最佳方法是什么?

2 个答案:

答案 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
}
相关问题