插入时使用
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在。