虚拟列表的注意事项
来源:互联网 发布:重装系统怎么保留软件 编辑:程序博客网 时间: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在。
- 虚拟列表的注意事项
- 虚拟列表控件的使用
- ListCtrl----虚拟列表的用法
- ListCtrl----虚拟列表的用法
- CListCtrl控件的虚拟列表
- ListCtrl----虚拟列表的用法
- 虚拟列表
- 虚拟列表
- 虚拟列表
- MFC中常用的虚拟键位列表
- MFC 虚拟列表控件的使用方法
- 控件CCtrlList的虚拟列表使用方法--详解
- 虚拟列表是可以排序的
- 继承ListActivity的自定义列表注意事项
- 构造器的初始化列表注意事项
- 列表样式的使用与注意事项
- 构造器参数列表的注意事项
- 在虚拟中搭建SQL server2005的注意事项
- Linux下设置tftp服务
- 一个很简单C++的程序
- 毕业--怀念
- 事务的隔离级别2 (TRANSACTION ISOLATION LEVEL)
- DispatchAction
- 虚拟列表的注意事项
- 开机启动后,只有一个key显示
- java日期时间小结
- 通过位操作实现变量值的交换
- Macromedia Flash 8 Video Encoder安装
- 赖志雄教你学英语
- 怎样在Windows和Linux下写相同的代码
- PC-Lint的lnt文件、配置方法,适用于VC++6.0与editplus
- 关于ASCII码