虚拟列表的注意事项

来源:互联网 发布:重装系统怎么保留软件 编辑:程序博客网 时间:2024/04/24 18:32

 树控件中使用虚拟列表

插入时使用


    TVITEM tvItem;
    ZeroMemory(&tvItem, sizeof(tvItem));
    tvItem.mask = TVIF_TEXT | TVIF_IMAGE |TVIF_CHILDREN |TVIF_SELECTEDIMAGE | TVIF_PARAM;
    tvItem.pszText = lpsfi.szDisplayName;
    tvItem.cchTextMax = lstrlen(lpsfi.szDisplayName);
    tvItem.iImage = lpsfi.iIcon;
    tvItem.cChildren =  lpsfi.dwAttributes & SFGAO_HASSUBFOLDER ? I_CHILDRENCALLBACK : 0;
    tvItem.iSelectedImage = lpsfi.iIcon;
    tvItem.lParam = FALSE;

    TV_INSERTSTRUCT tvis;
    tvis.item = tvItem;
    tvis.hParent = hItem;
    HTREEITEM hChild = InsertItem(&tvis);
然后


void CExpTree::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
 TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
 TVITEM *pitem = &(pTVDispInfo)->item;
 if (pitem->mask & TVIF_CHILDREN && pitem->hItem != NULL )
 {
  pitem->cChildren  = 1;
 } 
 *pResult = 0;
}

展开时


void CExpTree::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
 static bool bfirst = 1;

 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
 if(pNMHDR->code == TVN_ITEMEXPANDING && bfirst == 0)
 {
  NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  // TODO: Add your control notification handler code here
  HTREEITEM hItemNew = pNMTreeView->itemNew.hItem;
  
  if(hItemNew != NULL &&
   pNMTreeView->action  == TVE_EXPAND &&
   lpMalloc != NULL
   )
  {
   
   SetRedraw(FALSE);
   this->LockWindowUpdate();
   //     DeleteTree(hItemNew);
   InsertChildItem(hItemNew);
   UnlockWindowUpdate();
   SetRedraw(TRUE);
  }
 } 
 bfirst = 0;
 *pResult = 0;
}

展开后


void CExpTree::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
 if (pNMHDR->code == TVN_ITEMEXPANDED)
 {
  NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  // TODO: Add your control notification handler code here
  HTREEITEM hItemNew = pNMTreeView->itemNew.hItem;
  if(hItemNew != NULL && pNMTreeView->action  == TVE_COLLAPSE && lpMalloc != NULL)
   //  && pNMTreeView->itemNew.lParam == PARENT_NODE)
  {
   Expand(hItemNew ,TVE_COLLAPSE);
  }
 }

 *pResult = 0;
}

而列表控件的虚列表的使用为

插入时
void CUploadDlg::Add2SelList(int nItem)
{
 CString strFileName = m_PicList.GetItemText(nItem, 0);
 CString strFile = m_PicList.m_strDir + "//" + strFileName;
 if(find(m_vFile.begin(), m_vFile.end(), strFile) != m_vFile.end())
  return;

 m_nTotalSize += GetFileSize(strFile);
 if(m_nTotalSize > TOTALSIZE)
  return;
 CProgressCtrl *pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);
 pProg->SetPos((float)m_nTotalSize / TOTALSIZE * 100);
 CString str;
 str.Format("可用空间%dM,已选择上传%0.2fK",TOTALSIZE / 1024 /1024,(float)m_nTotalSize/1024);
 SetDlgItemText(IDC_TOTAL, str);
 int nIndex = m_SelList.GetItemCount();
 m_SelectImgList.SetImageCount(nIndex + 1);
 m_SelList.InsertItem(nIndex,strFileName, I_IMAGECALLBACK );
 m_vFile.push_back(strFile);
}
然后
void CUploadDlg::OnGetdispinfoImagelist(NMHDR* pNMHDR, LRESULT* pResult)
{
 LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
 // TODO: Add your control notification handler code here
 LV_ITEM *pItem = &(pDispInfo)->item;
 if(pItem->mask & LVIF_IMAGE)
 {
  if(pItem->iImage == -1)
  {
   pItem->mask |= LVIF_DI_SETITEM ;
   pItem->iImage =  pItem-> iItem;
   m_PicList.ReplaceImage(m_SelectImgList, pItem->iItem,
    m_vFile[pItem->iItem]);

  }
 }
 *pResult = 0;
}

注意差别,列表控件中使用了
   pItem->mask |= LVIF_DI_SETITEM ;

这样使系统在本次请求后保存数据,不会再次发送这个ITEM的请求,

否则的话会刷新一次就请求一次,导致显示很慢。

而树控件里面还未找到相应的解决办法,是一直在GetDispInfo在。

原创粉丝点击