因为要显示的数据量很大,所以想一边产生数据,一边显示出来,这样可能会友好一些,哪位大虾有什么好的建议?

解决方案 »

  1.   

    假设你的数据有10000条
    m_list.SetItemCountEx(10000);
    重载CListCtrl
    映射
    BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
       //{{AFX_MSG_MAP(CMyListCtrl)
       ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
       //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    假设CMyListCtrl::m_Items是已经产生的数据的数组
    这里把数据填到ListCtrl
    void CMyListCtrl::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
    {
           LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    LV_ITEM* pItem= &(pDispInfo)->item;int iItemIndx= pItem->iItem;if (pItem->mask & LVIF_TEXT) //valid text buffer?
    {
        //根据iItemIndx对ListCtrl设值
        switch(pItem->iSubItem){
            case 0: //fill in main text
                lstrcpy(pItem->pszText, 
                    m_Items[iItemIndx].m_strItemText);
                break;
            case 1: //fill in sub item 1 text
                lstrcpy(pItem->pszText,
                    m_Items[iItemIndx].m_strSubItem1Text);
                break;
            case 2: //fill in sub item 2 text
                lstrcpy(pItem->pszText,
                    m_Items[iItemIndx].m_strSubItem2Text);
                break;
        }
    }
    BOOL CMyListCtrl::OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult )
    {
         NMLVCACHEHINT* pcachehint=NULL;if (message == WM_NOTIFY)
        {
            NMHDR* phdr = (NMHDR*)lParam;        switch(phdr->code)
            {
            case LVN_ODCACHEHINT:
                pcachehint= (NMLVCACHEHINT*) phdr;
    //这里根据pcachehint->iFrom和pcachehint->iTo更新m_Items数据
                PrepCache(pcachehint->iFrom, pcachehint->iTo);
                break;
            default:
                return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);
            }
            return FALSE;
        }
        else
            return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);}