目录
1 响应TVN_ITEMEXPANDING 消息时 如何获得将要展开或收缩的那一个节点的句柄
2 怎么知道CTreeCtrl的一个节点是展开的还是收缩着的
4 使用 CImageList m_ImageList; 加载位图或图标,并将其与树控件联系在一起,由此便可以设置每个节点的图标
6 设置树控件形式为 TVS_HASBUTTONS|TVS_LINESATROOT 时, 树控件节点前才会出现+ - 号
10 利用InsertItem、SetItemData 存放与该节点有关的数字信息
一 基础操作
1 插入节点
1)插入根节点
//插入根节点
HTREEITEM hRoot;
CString str=L"ROOT"
hRoot=nTreeCtrl.InsertItem(str);
//相当于
hRoot=nTreeCtrl.InsertItem(str,TVI_ROOT,TVI_LAST);
2)插入孩子节点
//添加hRoot节点的孩子节点,并且被添加的节点位于hRoot所有孩子节点的末尾
HTREEITEM hChild=nTreeCtrl.InsertItem(str,hRoot);
//相当于
HTREEITEM hChild=nTreeCtrl.InsertItem(str,hRoot,TVI_LAST);
2 获得节点句柄
//获得根节点
HTREEITEM hRootItem;
hRootItem=nTreeCtrl.GetRootItem();
//获得当前节点
HTREEITEM hCurrentItem;
hCurrentItem=nTreeCtrl.GetSelectedItem();
//获得hItem的前一个节点
HTREEITEM hPreItem;
hPreItem=nTreeCtrl.GetNextItem(hItem,TVGN_PREVIOUS);
//获得hItem的下一个节点
HTREEITEM hNextItem;
hNextItem=nTreeCtrl.GetNextItem(hItem,TVGN_NEXT);
3 判断某节点是否有孩子节点
//判断某节点是否有孩子节点
if (nTreeCtrl.ItemHasChildren(hRoot))
4 展开或收缩子节点
//展开
if(nTreeCtrl.ItemHasChildren(hRoot))
nTreeCtrl.Expand(hParentItem,TVE_EXPAND);
5 获得第一个孩子节点的句柄
//判断某节点是否有孩子节点
if (nTreeCtrl.ItemHasChildren(hRoot))
{
//获得孩子节点
HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
}
6 遍历hRoot下一层的所有孩子节点
//判断某节点是否有孩子节点
if (nTreeCtrl.ItemHasChildren(hRoot))
{
//获得孩子节点
HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
//遍历hRoot下一层的所有孩子节点
while(hChild)
{
hChild=nTreeCtrl.GetNextItem(hChild,TVGN_NEXT);
}
}
7 获得某节点上的文字
//获得某节点上的文字
CString str;
nTreeCtrl.GetItemText(hRoot);
8 选择某节点,并让其获得焦点
首先,TREE控件的样式必须设置为TVS_SHOWSELALWAYS
其次: 选择该节点
treeCtrl.SelectItem(hItem);
最后,设置焦点
treeCtrl.SetFocus();
Tree控件设置焦点后,会自动将焦点定位到选择的节点上
9 清空树控件
nTreeCtrl.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 将文件列表中的文件插入树控件中
void InsetAllFile( list<CString>& filePathList){
CTreeCtrl & nTreeCtrl=((CMyTreeView*)(((CMainFrame*)AfxGetMainWnd())->m_SplitterWnd.GetPane(0,0)))->GetTreeCtrl();
nTreeCtrl.DeleteAllItems();
list<CString>::iterator it=filePathList.begin();
HTREEITEM hRoot=NULL;
CString filePath;
CString treeRootName=L"根目录"; //所有的文件都在根目录下 即:默认所有的文件都在同一个目录下
while(it!=filePathList.end())
{
filePath=*it;
if(hRoot==NULL)
hRoot=nTreeCtrl.InsertItem(treeRootName); //建立根目录
if(filePath.Find(treeRootName)==0) // 文件第一层目录与根目录相同,则截去文件第一层目录,文件从第二层目录开始
filePath=filePath.Right(filePath.GetLength()-treeRootName.GetLength()-1);
LoadPicFiles(nTreeCtrl,filePath, hRoot);
it++;
}
}
void LoadPicFiles(CTreeCtrl& nTreeCtrl, CString nFilePath, HTREEITEM nRoot)
{
// 判断nPicFolder是目录还是文件
// 如果是文件
// 直接将文件插入到树控件中 nTreeCtrl.InsertItem(nPicFolder,nRoot);
// 如果是目录
// 获取nPicFolder的第一层目录
// 判断nRoot目录下