Listview 如何为不可见列优化CListCtrl LVN_GETDISPINFO?

Listview 如何为不可见列优化CListCtrl LVN_GETDISPINFO?,listview,winapi,mfc,Listview,Winapi,Mfc,使用LVS_OWNERDATA CListCtrl,使列数超过屏幕上可见的列数,如何优化LVN_GETDISPINFO回调,以尽可能少地处理当前不可见的列(子项),因为这些列(子项)从左边缘或右边缘滚出 在不访问OwnerDraw的情况下,我可以阻止框架为屏幕上没有的列调用LVN_GETDISPINFO吗 在LVN_GETDISPINFO或LVN_ODCACHEHINT回调中计算哪些列(子项)可见的最佳方法是什么?否,您不能阻止ListView请求非可视列的数据。但您可以使用来确定给定的子项是否

使用LVS_OWNERDATA CListCtrl,使列数超过屏幕上可见的列数,如何优化LVN_GETDISPINFO回调,以尽可能少地处理当前不可见的列(子项),因为这些列(子项)从左边缘或右边缘滚出

在不访问OwnerDraw的情况下,我可以阻止框架为屏幕上没有的列调用LVN_GETDISPINFO吗


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

否,您不能阻止ListView请求非可视列的数据。但您可以使用来确定给定的子项是否超出ListView的可见客户端区域的边界。

检查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
}
//在LVN\u GETDISPINFO处理程序中。。。
NMLVDISPINFO*pDispInfo=重新解释(pNMHDR);
如果(pDispInfo->item.mask&LVIF_TEXT){
正确的眼睑直肌,头部直肌;
myList.GetClientRect(&myListRect);
myList.GetHeaderCtrl()->GetItemRect(pDispInfo->item.iSubitem和&headerRect);
int hScrollPos=myList.GetScrollPos(SB_HORIZ);
if(headerRect.righthScrollPos+myListRect.right){
strcpy_s(pDispInfo->item.pszText,pDispInfo->item.cchTextMax,“”);
*预设值=0;
返回;
}
//否则,构建响应字符串
}

在LVN_ODCACHEHINT消息上使用GetSubItemRect添加列可见性检查效果很好,我应该能够处理重新排序的列。我遇到一个建议,只对左右边缘使用LVM_HITTEST,但效果很好。