【问题标题】:How to optimize CListCtrl LVN_GETDISPINFO for non-visible columns?如何为不可见的列优化 CListCtrl LVN_GETDISPINFO?
【发布时间】:2014-10-20 23:15:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: listview winapi mfc


    【解决方案1】:

    不,您不能阻止 ListView 为非可视列请求数据。但是您可以使用LVM_GETSUBITEMRECT 来确定给定的子项是否超出了 ListView 可见客户区的范围。

    【讨论】:

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

    检查 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
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2021-12-27
      相关资源
      最近更新 更多