1. 插入节点
插入根节点
HTREEITEM hRoot;
CString str=L"ROOT"
hRoot=nTreeCtrl.InsertItem(str);
//相当于
hRoot=nTreeCtrl.InsertItem(str,TVI_ROOT,TVI_LAST);
插入孩子节点
//添加hRoot节点的孩子节点,并且被添加的节点位于hRoot所有孩子节点的末尾
HTREEITEM hChild=nTreeCtrl.InsertItem(str,hRoot);
//相当于
HTREEITEM hChild=nTreeCtrl.InsertItem(str,hRoot,TVI_LAST);
2. 获得节点句柄
//获得根节点
HTREEITEM hRootItem = nTreeCtrl.GetRootItem();
//获得当前节点
HTREEITEM hCurrentItem = nTreeCtrl.GetSelectedItem();
//获得hItem的前一个节点
HTREEITEM hPreItem = nTreeCtrl.GetNextItem(hItem,TVGN_PREVIOUS);
//获得hItem的下一个节点
HTREEITEM hNextItem = nTreeCtrl.GetNextItem(hItem,TVGN_NEXT);
// 获取hItem的第一个子节点
HTREEITEM hChild = tree.GetNextItem(hItem, TVGN_CHILD);
HTREEITEM hChild = tree.GetChildItem(hItem, TVGN_CHILD);
// 获取hItem的父节点
HTREEITEM hParent = tree.GetNextItem(hItem, TVGN_PARENT);
HTREEITEM hParent = tree.GetParentItem(hItem);
// 获取hItem前一个兄弟节点
HTREEITEM hPreSibling = tree.GetPrevSiblingItem(hItem);
// 获取hItem后一个兄弟节点
HTREEITEM hNextSibling = tree.GetNextSiblingItem(hItem);
3. 判断某节点是否有孩子节点
BOOL bHaveChild = tree.ItemHasChildren(hItem);
4. 展开或收缩子节点
tree.Expand(hItem,TVE_EXPAND); // 展开
tree.Expand(hItem,TVE_COLLAPSE); // 闭合
6. 遍历hRoot下一层的所有孩子节点
//判断某节点是否有孩子节点
if (nTreeCtrl.ItemHasChildren(hRoot))
{
//获得孩子节点
HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
//遍历hRoot下一层的所有孩子节点
while(hChild)
{
hChild=nTreeCtrl.GetNextItem(hChild,TVGN_NEXT);
}
}
8. 选择某节点,并让其获得焦点
首先,TREE控件的样式必须设置为TVS_SHOWSELALWAYS
其次: 选择该节点
treeCtrl.SelectItem(hItem);
最后,设置焦点
treeCtrl.SetFocus();
Tree控件设置焦点后,会自动将焦点定位到选择的节点上
9. 清空树控件
tree.DeleteAllItems();
10. 将指定目录下的文件插入节点
void InsertPath(CString path, HTREEITEM hRoot, CTreeCtrl& ctrl)
{
CFileFind nFindFile;
CString str=L"";
CString nPicFileName=L"";
BOOL IsExist=FALSE;
HTREEITEM hSubItem;
nPicFileName.Format(L"%s\\*.*",path);
IsExist = nFindFile.FindFile(nPicFileName);
while (IsExist)
{
IsExist = nFindFile.FindNextFile();
if(nFindFile.IsDots())
continue;
nPicFileName = nFindFile.GetFileName();
//路径
if(nFindFile.IsDirectory())
{
hSubItem = ctrl.InsertItem(nPicFileName,hRoot);
InsertPath(nFindFile.GetFilePath(),hSubItem,ctrl);
}
else
{
//文件
str = nPicFileName.Right(4);
if(!str.CompareNoCase(_T(".jpg")) || !str.CompareNoCase(_T(".tif")))
{
ctrl.InsertItem(nPicFileName,hRoot);
}
}
}
nFindFile.Close();
}
void LoadPath(CString path) //path为指定目录 此函数的作用为将path目录下的文件插入树控件中
{
CTreeCtrl& ctrl = GetTreeCtrl();
ASSERT(ctrl);
ctrl.DeleteAllItems();
HTREEITEM hRoot = ctrl.InsertItem(path);
InsertPath(path,hRoot,ctrl);
ctrl.Expand(hRoot,TVE_EXPAND);
}
11. 响应TVN_ITEMEXPANDING 消息时 如何获得将要展开或收缩的那一个节点的句柄
void CLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代
HTREEITEM htree=pNMTreeView->itemNew.hItem; // 这个就是 将要被扩展或收缩节点的句柄
}
12. 怎么知道CTreeCtrl的一个节点是展开的还是收缩着的
BOOL bExpand = (GetItemState(hItem, TVIS_EXPANDED) & TVIS_EXPANDED) == TVIS_EXPANDED;
13. 判断节点是否被扩展过
BOOL bExpanded = (tree.GetItemState(hItem, TVIS_EXPANDEDONCE) & TVIS_EXPANDEDONCE) != 0 ;
14. 使用CImageList加载位图或图标,并将其与树控件联系在一起
CImageList m_ImageList;
m_ImageList.Create(12,12,ILC_COLORDDB | ILC_MASK, 3, 1);
HICON hAdd = ::LoadIcon(::AfxGetInstanceHandle(), (LPCTSTR)IDI_ADD);
HICON hRemove = ::LoadIcon(::AfxGetInstanceHandle(), (LPCTSTR)IDI_REMOVE);
HICON hLeaf = ::LoadIcon(::AfxGetInstanceHandle(), (LPCTSTR)IDI_LEAF);
m_ImageList.Add(hAdd);
m_ImageList.Add(hRemove);
m_ImageList.Add(hLeaf);
tree.SetImageList(&m_ImageList,TVSIL_NORMAL); // 树控件和图像列表相连
m_treeCtrl.SetItemImage(htree,0,0) //设置节点的图标
15. 什么时候响应OnItemexpanding 消息
当节点第一次被展开时,才响应此消息。也就是说:当以开后该节点再展开或收缩时,便不再响应此消息了。