一 基础操作
1 插入节点
1)插入根节点
- //插入根节点
- HTREEITEM hRoot;
- CString str=L"ROOT"
- hRoot=nTreeCtrl.InsertItem(str);
- //相当于
- hRoot=nTreeCtrl.InsertItem(str,TVI_ROOT,TVI_LAST);
//插入根节点
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);
//添加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);
//获得根节点
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))
//判断某节点是否有孩子节点
if (nTreeCtrl.ItemHasChildren(hRoot))
4 展开或收缩子节点
- //展开
- if(nTreeCtrl.ItemHasChildren(hRoot))
- nTreeCtrl.Expand(hParentItem,TVE_EXPAND);
//展开
if(nTreeCtrl.ItemHasChildren(hRoot))
nTreeCtrl.Expand(hParentItem,TVE_EXPAND);
5 获得第一个孩子节点的句柄
- //判断某节点是否有孩子节点
- if (nTreeCtrl.ItemHasChildren(hRoot))
- {
- //获得孩子节点
- HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
- }
//判断某节点是否有孩子节点
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);
- }
- }
//判断某节点是否有孩子节点
if (nTreeCtrl.ItemHasChildren(hRoot))
{
//获得孩子节点
HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
//遍历hRoot下一层的所有孩子节点
while(hChild)
{
hChild=nTreeCtrl.GetNextItem(hChild,TVGN_NEXT);
}
}
7 获得某节点上的文字
- //获得某节点上的文字
- CString str;
- nTreeCtrl.GetItemText(hRoot);
//获得某节点上的文字
CString str;
nTreeCtrl.GetItemText(hRoot);
8 选择某节点,并让其获得焦点
首先,TREE控件的样式必须设置为TVS_SHOWSELALWAYS
其次: 选择该节点
- treeCtrl.SelectItem(hItem);
treeCtrl.SelectItem(hItem);
最后,设置焦点
- treeCtrl.SetFocus();
treeCtrl.SetFocus();
Tree控件设置焦点后,会自动将焦点定位到选择的节点上
9 清空树控件
- <strong> nTreeCtrl.DeleteAllItems();</strong>
<strong> nTreeCtrl.DeleteAllItems();</strong>
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 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);
- }
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 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目录下是否已经有此层目录
- // 如果有此层目录
- // 递归插入其他
- // 如果无此层目录
- // 插入此层目录,然后递归插入其他
- CString nSubFolder; //首层目录
- CString nSubFilePath; //去掉首层目录后的文件名
- BOOL IsExist=FALSE;
- int nIndex=-1;
- nIndex=nFilePath.Find(L'\\');
- if(nIndex>=0) //目录
- {
- nSubFolder=nFilePath.Left(nIndex);
- nSubFilePath=nFilePath.Right(nFilePath.GetLength()-nIndex-1);
- HTREEITEM nSubRoot=NULL;
- if(nTreeCtrl.ItemHasChildren(nRoot))
- nSubRoot=nTreeCtrl.GetChildItem(nRoot);
- CString str;
- BOOL bExist=FALSE;
- while(nSubRoot)
- {
- str=nTreeCtrl.GetItemText(nSubRoot);
- if (str.CompareNoCase(nSubFolder)==0)
- {
- bExist=TRUE;
- break;
- }
- nSubRoot=nTreeCtrl.GetNextSiblingItem(nSubRoot);
- }
- if(!bExist)
- {
- nSubRoot=nTreeCtrl.InsertItem(nSubFolder,nRoot);
- LoadPicFiles(nTreeCtrl,nSubFilePath,nSubRoot);
- }else{
- LoadPicFiles(nTreeCtrl,nSubFilePath,nSubRoot);
- }
- }
- else if(nFilePath.Find(L".jpg")!=-1 || nFilePath.Find(L".tif")!=-1)
- {
- nTreeCtrl.InsertItem(nFilePath,nRoot);
- }
- }
void LoadPicFiles(CTreeCtrl& nTreeCtrl, CString nFilePath, HTREEITEM nRoot)
{
// 判断nPicFolder是目录还是文件
// 如果是文件
// 直接将文件插入到树控件中 nTreeCtrl.InsertItem(nPicFolder,nRoot);
// 如果是目录
// 获取nPicFolder的第一层目录
// 判断nRoot目录下是否已经有此层目录
// 如果有此层目录
// 递归插入其他
// 如果无此层目录
// 插入此层目录,然后递归插入其他
CString nSubFolder; //首层目录
CString nSubFilePath; //去掉首层目录后的文件名
BOOL IsExist=FALSE;
int nIndex=-1;
nIndex=nFilePath.Find(L'\\');
if(nIndex>=0) //目录
{
nSubFolder=nFilePath.Left(nIndex);
nSubFilePath=nFilePath.Right(nFilePath.GetLength()-nIndex-1);
HTREEITEM nSubRoot=NULL;
if(nTreeCtrl.ItemHasChildren(nRoot))
nSubRoot=nTreeCtrl.GetChildItem(nRoot);
CString str;
BOOL bExist=FALSE;
while(nSubRoot)
{
str=nTreeCtrl.GetItemText(nSubRoot);
if (str.CompareNoCase(nSubFolder)==0)
{
bExist=TRUE;
break;
}
nSubRoot=nTreeCtrl.GetNextSiblingItem(nSubRoot);
}
if(!bExist)
{
nSubRoot=nTreeCtrl.InsertItem(nSubFolder,nRoot);
LoadPicFiles(nTreeCtrl,nSubFilePath,nSubRoot);
}else{
LoadPicFiles(nTreeCtrl,nSubFilePath,nSubRoot);
}
}
else if(nFilePath.Find(L".jpg")!=-1 || nFilePath.Find(L".tif")!=-1)
{
nTreeCtrl.InsertItem(nFilePath,nRoot);
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二 扩展操作
1 响应TVN_ITEMEXPANDING 消息时 如何获得将要展开或收缩的那一个节点的句柄
MSDN:
<strong>TVN_ITEMEXPANDING</strong> <em><a target=_blank class="synParam" href="">pnmtv</a></em> <strong>= (NM_TREEVIEW FAR *)</strong> <em>lParam</em>
pnmtv
- Pointer to an NM_TREEVIEW structure. The itemNew member is a TVITEM structure that contains valid information about the parent item in the hItem, state, and lParam members. The action member indicates whether the list is to expand or collapse. For a list of possible values, see the description of the TVM_EXPAND message.
。。。。。。。。。
- typedef struct _NM_TREEVIEW {
- NMHDR hdr;
- UINT action;
- TV_ITEM itemOld;
- TV_ITEM itemNew;
- POINT ptDrag;
- } NM_TREEVIEW;
- typedef NM_TREEVIEW FAR* LPNM_TREEVIEW;
typedef struct _NM_TREEVIEW {
NMHDR hdr;
UINT action;
TV_ITEM itemOld;
TV_ITEM itemNew;
POINT ptDrag;
} NM_TREEVIEW;
typedef NM_TREEVIEW FAR* LPNM_TREEVIEW;
- typedef struct _TV_ITEM { tvi
- UINT mask;
- HTREEITEM hItem;
- UINT state;
- UINT stateMask;
- LPSTR pszText;
- int cchTextMax;
- int iImage;
- int iSelectedImage;
- int cChildren;
- LPARAM lParam; }
- TV_ITEM, FAR* LPTV_ITEM;
typedef struct _TV_ITEM { tvi
UINT mask;
HTREEITEM hItem;
UINT state;
UINT stateMask;
LPSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int cChildren;
LPARAM lParam; }
TV_ITEM, FAR* LPTV_ITEM;
在 TV_ITEM 的 hItem中 存放着要展开项的句柄
解决:查了这么多,其实很简单 代码如下:
- void CLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
- {
- LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
- // TODO: 在此添加控件通知处理程序代
- HTREEITEM htree=pNMTreeView->itemNew.hItem; // 这个就是 将要被扩展或收缩节点的句柄
- 。。。
- }
void CLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代
HTREEITEM htree=pNMTreeView->itemNew.hItem; // 这个就是 将要被扩展或收缩节点的句柄
。。。
}
2 怎么知道CTreeCtrl的一个节点是展开的还是收缩着的
解决:
方法1
- <strong> (GetItemState(hItem, TVIS_EXPANDED )&TVIS_EXPANDED)!=TVIS_EXPANDED //如果相等,则说明改节点是扩展的,如果不相等,则说明该节点是收缩的</strong>
<strong> (GetItemState(hItem, TVIS_EXPANDED )&TVIS_EXPANDED)!=TVIS_EXPANDED //如果相等,则说明改节点是扩展的,如果不相等,则说明该节点是收缩的</strong>
方法2
响应TVN_ITEMEXPANDING事件时:
- void CExampleDlg::OnItemexpandingTree1(NMHDR* pNMHDR, LRESULT* pResult)
- {
- NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
- if (pNMTreeView->action == TVE_COLLAPSE) //判断action的值
- 。。。
- 。。。
- }
void CExampleDlg::OnItemexpandingTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if (pNMTreeView->action == TVE_COLLAPSE) //判断action的值
。。。
。。。
}
3 判断节点是否被扩展过
- if ((GetTreeCtrl().GetItemState(hItem,TVIS_EXPANDEDONCE )&TVIS_EXPANDEDONCE )!=0 ) //判断是否扩展过一次,若!=0则说明被扩展过
if ((GetTreeCtrl().GetItemState(hItem,TVIS_EXPANDEDONCE )&TVIS_EXPANDEDONCE )!=0 ) //判断是否扩展过一次,若!=0则说明被扩展过
4 使用 CImageList m_ImageList; 加载位图或图标,并将其与树控件联系在一起,由此便可以设置每个节点的图标
- 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);
- GetTreeCtrl().SetImageList(&m_ImageList,TVSIL_NORMAL); // 树控件和图像列表相连
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);
GetTreeCtrl().SetImageList(&m_ImageList,TVSIL_NORMAL); // 树控件和图像列表相连
- m_treeCtrl.SetItemImage(htree,0,0) // 通过SetItemImage(htree,0,0) 设置节点的图标
m_treeCtrl.SetItemImage(htree,0,0) // 通过SetItemImage(htree,0,0) 设置节点的图标
5 什么时候响应OnItemexpanding 消息
当节点第一次被展开时,才响应此消息。也就是说:当以开后该节点再展开或收缩时,便不再响应此消息了。
6 设置树控件形式为 TVS_HASBUTTONS|TVS_LINESATROOT 时, 树控件节点前才会出现+ - 号
以下为综合例子: 点击按钮上一个 显示该节点的上一个兄弟节点,并更改控件焦点
设置控件样式:
- BOOL CTreePathView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: 在此处通过修改
- // CREATESTRUCT cs 来修改窗口类或样式
- cs.style|=TVS_HASLINES|TVS_SHOWSELALWAYS; //若是想用CImageList的图标 ,则不要设置为TVS_HASBUTTONS形式
- return CTreeView::PreCreateWindow(cs);
- }
BOOL CTreePathView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
cs.style|=TVS_HASLINES|TVS_SHOWSELALWAYS; //若是想用CImageList的图标 ,则不要设置为TVS_HASBUTTONS形式
return CTreeView::PreCreateWindow(cs);
}
点击按钮5(焦点移动到上一个兄弟节点)
- void NewImageView::OnBnClickedButton5() // 上一个图
- {
- // TODO: 在此添加控件通知处理程序代码
- CTreePathView * pTree=(CTreePathView* )(((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,0));
- CTreeCtrl & treeCtrl=pTree->GetTreeCtrl();
- HTREEITEM hItem=treeCtrl.GetSelectedItem();
- if (hItem!=NULL)
- {
- hItem=treeCtrl.GetNextItem(hItem,TVGN_PREVIOUS);
- if (hItem!=NULL)
- {
- CString str;
- str=pTree->GetFullPath(hItem);
- SetImage(str);
- treeCtrl.SelectItem(hItem);
- treeCtrl.SetFocus();
- InvalidateRect(m_ClientRect);
- }
- }
- }
void NewImageView::OnBnClickedButton5() // 上一个图
{
// TODO: 在此添加控件通知处理程序代码
CTreePathView * pTree=(CTreePathView* )(((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,0));
CTreeCtrl & treeCtrl=pTree->GetTreeCtrl();
HTREEITEM hItem=treeCtrl.GetSelectedItem();
if (hItem!=NULL)
{
hItem=treeCtrl.GetNextItem(hItem,TVGN_PREVIOUS);
if (hItem!=NULL)
{
CString str;
str=pTree->GetFullPath(hItem);
SetImage(str);
treeCtrl.SelectItem(hItem);
treeCtrl.SetFocus();
InvalidateRect(m_ClientRect);
}
}
}
点击按钮6(焦点移动到下一个兄弟节点)
- void NewImageView::OnBnClickedButton6() //下一个
- {
- // TODO: 在此添加控件通知处理程序代码
- CTreePathView * pTree=(CTreePathView* )(((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,0));
- CTreeCtrl & treeCtrl=pTree->GetTreeCtrl();
- HTREEITEM hItem=treeCtrl.GetSelectedItem();
- if (hItem!=NULL)
- {
- hItem=treeCtrl.GetNextItem(hItem,TVGN_NEXT);
- if (hItem!=NULL)
- {
- CString str;
- str=pTree->GetFullPath(hItem);
- SetImage(str);
- treeCtrl.SelectItem(hItem);
- treeCtrl.SetFocus();
- InvalidateRect(m_ClientRect);
- }
- }
- }
void NewImageView::OnBnClickedButton6() //下一个
{
// TODO: 在此添加控件通知处理程序代码
CTreePathView * pTree=(CTreePathView* )(((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,0));
CTreeCtrl & treeCtrl=pTree->GetTreeCtrl();
HTREEITEM hItem=treeCtrl.GetSelectedItem();
if (hItem!=NULL)
{
hItem=treeCtrl.GetNextItem(hItem,TVGN_NEXT);
if (hItem!=NULL)
{
CString str;
str=pTree->GetFullPath(hItem);
SetImage(str);
treeCtrl.SelectItem(hItem);
treeCtrl.SetFocus();
InvalidateRect(m_ClientRect);
}
}
}
7 遍历树控件的所有节点
1) 获得根节点句柄
- CTreeCtrl& nTreeCtrl=((CImportTreeView*)m_SplitterWnd.GetPane(0,0))->GetTreeCtrl();
- HTREEITEM hItem;
- //获得根目录节点
- hItem = nTreeCtrl.GetRootItem();
- //遍历树控件节点
- TreeVisit(&nTreeCtrl,hItem);
CTreeCtrl& nTreeCtrl=((CImportTreeView*)m_SplitterWnd.GetPane(0,0))->GetTreeCtrl();
HTREEITEM hItem;
//获得根目录节点
hItem = nTreeCtrl.GetRootItem();
//遍历树控件节点
TreeVisit(&nTreeCtrl,hItem);
2)遍历所有节点
- void TreeVisit(CTreeCtrl* pCtrl,HTREEITEM hItem)
- {
- if(pCtrl->ItemHasChildren(hItem))
- {
- HTREEITEM hChildItem = pCtrl->GetChildItem(hItem);
- while(hChildItem!=NULL)
- {
- TreeVisit(pCtrl,hChildItem); //递归遍历孩子节点
- hChildItem = pCtrl->GetNextItem(hChildItem, TVGN_NEXT);
- }
- }
- else // 对叶子节点进行操作
- Leaf(pCtrl,hItem);
- }
void TreeVisit(CTreeCtrl* pCtrl,HTREEITEM hItem)
{
if(pCtrl->ItemHasChildren(hItem))
{
HTREEITEM hChildItem = pCtrl->GetChildItem(hItem);
while(hChildItem!=NULL)
{
TreeVisit(pCtrl,hChildItem); //递归遍历孩子节点
hChildItem = pCtrl->GetNextItem(hChildItem, TVGN_NEXT);
}
}
else // 对叶子节点进行操作
Leaf(pCtrl,hItem);
}
8 获得某Item节点的全路径
- CString m_ParentFolder[10];
- CString m_OldParentFolder[10];
CString m_ParentFolder[10];
CString m_OldParentFolder[10];
- //--------------------将nParent添加到nParentFolder[10]第一位----------------------
- BOOL AddParentFolder(CString nParentFolder[10], CString nParent)
- {
- for(int i=9;i>0;i--)
- nParentFolder[i]=nParentFolder[i-1];
- nParentFolder[0]=nParent;
- return TRUE;
- }
- //---------------------nParentFolder[10]中的有效数据整合(加\)---------------------
- CString AllCString(CString nParentFolder[10])
- {
- CString nAllCString=L"";
- for(int i=0;i<10;i++)
- {
- if(nParentFolder[i]==L"") break;
- nAllCString+=L"\\"+nParentFolder[i];
- }
- return nAllCString;
- }
//--------------------将nParent添加到nParentFolder[10]第一位----------------------
BOOL AddParentFolder(CString nParentFolder[10], CString nParent)
{
for(int i=9;i>0;i--)
nParentFolder[i]=nParentFolder[i-1];
nParentFolder[0]=nParent;
return TRUE;
}
//---------------------nParentFolder[10]中的有效数据整合(加\)---------------------
CString AllCString(CString nParentFolder[10])
{
CString nAllCString=L"";
for(int i=0;i<10;i++)
{
if(nParentFolder[i]==L"") break;
nAllCString+=L"\\"+nParentFolder[i];
}
return nAllCString;
}
获得Item节点路径的函数
- CString GetItemPath(CTreeCtrl* pCtrl,HTREEITEM hItem)
- {
- CString nSelItemName=pCtrl->GetItemText(hItem);
- HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
- if (parentItem==NULL) //hItem即为根目录
- return nSelItemName;
- //清空OLD
- for(int i=0;i<10;i++) m_OldParentFolder[i]=L"";
- //m_OldParentFolder 记录上一个节点的父节点
- for(int i=0;i<10;i++)
- m_OldParentFolder[i]=m_ParentFolder[i];
- //m_ParentFolder 记录当前节点的父亲节点
- for(int i=0;i<10;i++)
- m_ParentFolder[i]=L"";
- CString itemPath;
- CString parentFolder=nSelItemName;
- //将parentFolder添加到m_ParentFolder[0],其他值依次后移
- AddParentFolder(m_ParentFolder,parentFolder);
- // m_PicFolder 为根节点对应的名字
- while(parentItem!=NULL&&pCtrl->GetItemText(parentItem).Compare(m_PicFolder))
- {
- parentFolder=pCtrl->GetItemText(parentItem);
- AddParentFolder(m_ParentFolder,parentFolder);
- parentItem=pCtrl->GetParentItem(parentItem);
- }
- itemPath.Format(L"%s%s",m_PicFolder,AllCString(m_ParentFolder));
- //清空OLD
- for(int i=0;i<10;i++) m_OldParentFolder[i]=L"";
- //清空
- for(int i=0;i<10;i++)
- m_ParentFolder[i]=L"";
- return itemPath;
- }
CString GetItemPath(CTreeCtrl* pCtrl,HTREEITEM hItem)
{
CString nSelItemName=pCtrl->GetItemText(hItem);
HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
if (parentItem==NULL) //hItem即为根目录
return nSelItemName;
//清空OLD
for(int i=0;i<10;i++) m_OldParentFolder[i]=L"";
//m_OldParentFolder 记录上一个节点的父节点
for(int i=0;i<10;i++)
m_OldParentFolder[i]=m_ParentFolder[i];
//m_ParentFolder 记录当前节点的父亲节点
for(int i=0;i<10;i++)
m_ParentFolder[i]=L"";
CString itemPath;
CString parentFolder=nSelItemName;
//将parentFolder添加到m_ParentFolder[0],其他值依次后移
AddParentFolder(m_ParentFolder,parentFolder);
// m_PicFolder 为根节点对应的名字
while(parentItem!=NULL&&pCtrl->GetItemText(parentItem).Compare(m_PicFolder))
{
parentFolder=pCtrl->GetItemText(parentItem);
AddParentFolder(m_ParentFolder,parentFolder);
parentItem=pCtrl->GetParentItem(parentItem);
}
itemPath.Format(L"%s%s",m_PicFolder,AllCString(m_ParentFolder));
//清空OLD
for(int i=0;i<10;i++) m_OldParentFolder[i]=L"";
//清空
for(int i=0;i<10;i++)
m_ParentFolder[i]=L"";
return itemPath;
}
获得叶子节点的函数
- void Leaf(CTreeCtrl* pCtrl,HTREEITEM hItem)
- {
- CString itemName=pCtrl->GetItemText(hItem);
- // 叶子节点是jpg文件或tif文件
- if(nSelItemName.Find(L".jpg")!=-1 || nSelItemName.Find(L".tif")!=-1)
- {
- 一 基础操作
1 插入节点
1)插入根节点
[cpp] view plaincopy
01.//插入根节点
02.HTREEITEM hRoot;
03.CString str=L"ROOT"
04.hRoot=nTreeCtrl.InsertItem(str);
05.
06.//相当于
07.hRoot=nTreeCtrl.InsertItem(str,TVI_ROOT,TVI_LAST);
2)插入孩子节点
[cpp] view plaincopy
01.//添加hRoot节点的孩子节点,并且被添加的节点位于hRoot所有孩子节点的末尾
02.HTREEITEM hChild=nTreeCtrl.InsertItem(str,hRoot);
03.
04.//相当于
05.HTREEITEM hChild=nTreeCtrl.InsertItem(str,hRoot,TVI_LAST);
2 获得节点句柄
[cpp] view plaincopy
01.//获得根节点
02.HTREEITEM hRootItem;
03.hRootItem=nTreeCtrl.GetRootItem();
04.
05.
06.//获得当前节点
07.HTREEITEM hCurrentItem;
08.hCurrentItem=nTreeCtrl.GetSelectedItem();
09.
10.
11.//获得hItem的前一个节点
12.
13.HTREEITEM hPreItem;
14.hPreItem=nTreeCtrl.GetNextItem(hItem,TVGN_PREVIOUS);
15.
16.
17.//获得hItem的下一个节点
18.HTREEITEM hNextItem;
19.hNextItem=nTreeCtrl.GetNextItem(hItem,TVGN_NEXT);
3 判断某节点是否有孩子节点
[cpp] view plaincopy
01.//判断某节点是否有孩子节点
02.if (nTreeCtrl.ItemHasChildren(hRoot))
4 展开或收缩子节点
[cpp] view plaincopy
01.//展开
02.if(nTreeCtrl.ItemHasChildren(hRoot))
03. nTreeCtrl.Expand(hParentItem,TVE_EXPAND);
5 获得第一个孩子节点的句柄
[cpp] view plaincopy
01.//判断某节点是否有孩子节点
02.if (nTreeCtrl.ItemHasChildren(hRoot))
03.{
04. //获得孩子节点
05. HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
06.
07.}
6 遍历hRoot下一层的所有孩子节点
[cpp] view plaincopy
01.//判断某节点是否有孩子节点
02.if (nTreeCtrl.ItemHasChildren(hRoot))
03.{
04. //获得孩子节点
05. HTREEITEM hChild=nTreeCtrl.GetChildItem(hRoot);
06.
07. //遍历hRoot下一层的所有孩子节点
08. while(hChild)
09. {
10. hChild=nTreeCtrl.GetNextItem(hChild,TVGN_NEXT);
11.
12. }
13.
14.}
7 获得某节点上的文字
[cpp] view plaincopy
01.//获得某节点上的文字
02.CString str;
03.nTreeCtrl.GetItemText(hRoot);
8 选择某节点,并让其获得焦点
首先,TREE控件的样式必须设置为TVS_SHOWSELALWAYS
其次: 选择该节点
[html] view plaincopy
01.treeCtrl.SelectItem(hItem);
最后,设置焦点
[html] view plaincopy
01.treeCtrl.SetFocus();
Tree控件设置焦点后,会自动将焦点定位到选择的节点上
9 清空树控件
[cpp] view plaincopy
01.<strong> nTreeCtrl.DeleteAllItems();</strong>
10 将指定目录下的文件插入节点
[cpp] view plaincopy
01.void InsertPath(CString path, HTREEITEM hRoot, CTreeCtrl& ctrl)
02.{
03. CFileFind nFindFile;
04. CString str=L"";
05. CString nPicFileName=L"";
06. BOOL IsExist=FALSE;
07. HTREEITEM hSubItem;
08.
09. nPicFileName.Format(L"%s\\*.*",path);
10. IsExist = nFindFile.FindFile(nPicFileName);
11. while (IsExist)
12. {
13. IsExist = nFindFile.FindNextFile();
14. if(nFindFile.IsDots())
15. continue;
16. nPicFileName = nFindFile.GetFileName();
17.
18. //路径
19. if(nFindFile.IsDirectory())
20. {
21. hSubItem = ctrl.InsertItem(nPicFileName,hRoot);
22. InsertPath(nFindFile.GetFilePath(),hSubItem,ctrl);
23. }
24. else
25. {
26. //文件
27. str = nPicFileName.Right(4);
28. if(!str.CompareNoCase(_T(".jpg")) || !str.CompareNoCase(_T(".tif")))
29. {
30. ctrl.InsertItem(nPicFileName,hRoot);
31. }
32. }
33. }
34. nFindFile.Close();
35.}
[cpp] view plaincopy
01.void LoadPath(CString path) //path为指定目录 此函数的作用为将path目录下的文件插入树控件中
02.{
03. CTreeCtrl& ctrl = GetTreeCtrl();
04. ASSERT(ctrl);
05. ctrl.DeleteAllItems();
06. HTREEITEM hRoot = ctrl.InsertItem(path);
07. InsertPath(path,hRoot,ctrl);
08. ctrl.Expand(hRoot,TVE_EXPAND);
09.
10.}
11 将文件列表中的文件插入树控件中
[cpp] view plaincopy
01.void InsetAllFile( list<CString>& filePathList){
02.
03.
04. CTreeCtrl & nTreeCtrl=((CMyTreeView*)(((CMainFrame*)AfxGetMainWnd())->m_SplitterWnd.GetPane(0,0)))->GetTreeCtrl();
05. nTreeCtrl.DeleteAllItems();
06.
07. list<CString>::iterator it=filePathList.begin();
08. HTREEITEM hRoot=NULL;
09. CString filePath;
10. CString treeRootName=L"根目录"; //所有的文件都在根目录下 即:默认所有的文件都在同一个目录下
11.
12. while(it!=filePathList.end())
13. {
14. filePath=*it;
15.
16.
17.
18. if(hRoot==NULL)
19. hRoot=nTreeCtrl.InsertItem(treeRootName); //建立根目录
20.
21.
22.
23. if(filePath.Find(treeRootName)==0) // 文件第一层目录与根目录相同,则截去文件第一层目录,文件从第二层目录开始
24. filePath=filePath.Right(filePath.GetLength()-treeRootName.GetLength()-1);
25.
26.
27. LoadPicFiles(nTreeCtrl,filePath, hRoot);
28.
29. it++;
30. }
31.
32.}
[cpp] view plaincopy
01.void LoadPicFiles(CTreeCtrl& nTreeCtrl, CString nFilePath, HTREEITEM nRoot)
02.{
03.
04.// 判断nPicFolder是目录还是文件
05.// 如果是文件
06.// 直接将文件插入到树控件中 nTreeCtrl.InsertItem(nPicFolder,nRoot);
07.// 如果是目录
08.// 获取nPicFolder的第一层目录
09.// 判断nRoot目录下是否已经有此层目录
10.// 如果有此层目录
11.// 递归插入其他
12.// 如果无此层目录
13.// 插入此层目录,然后递归插入其他
14.
15.
16. CString nSubFolder; //首层目录
17. CString nSubFilePath; //去掉首层目录后的文件名
18. BOOL IsExist=FALSE;
19.
20.
21.
22. int nIndex=-1;
23. nIndex=nFilePath.Find(L'\\');
24.
25. if(nIndex>=0) //目录
26. {
27. nSubFolder=nFilePath.Left(nIndex);
28. nSubFilePath=nFilePath.Right(nFilePath.GetLength()-nIndex-1);
29.
30. HTREEITEM nSubRoot=NULL;
31. if(nTreeCtrl.ItemHasChildren(nRoot))
32. nSubRoot=nTreeCtrl.GetChildItem(nRoot);
33. CString str;
34. BOOL bExist=FALSE;
35. while(nSubRoot)
36. {
37. str=nTreeCtrl.GetItemText(nSubRoot);
38.
39. if (str.CompareNoCase(nSubFolder)==0)
40. {
41.
42. bExist=TRUE;
43. break;
44. }
45.
46. nSubRoot=nTreeCtrl.GetNextSiblingItem(nSubRoot);
47. }
48.
49. if(!bExist)
50. {
51.
52. nSubRoot=nTreeCtrl.InsertItem(nSubFolder,nRoot);
53.
54. LoadPicFiles(nTreeCtrl,nSubFilePath,nSubRoot);
55. }else{
56. LoadPicFiles(nTreeCtrl,nSubFilePath,nSubRoot);
57. }
58. }
59. else if(nFilePath.Find(L".jpg")!=-1 || nFilePath.Find(L".tif")!=-1)
60. {
61. nTreeCtrl.InsertItem(nFilePath,nRoot);
62. }
63.}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二 扩展操作
1 响应TVN_ITEMEXPANDING 消息时 如何获得将要展开或收缩的那一个节点的句柄
MSDN:
TVN_ITEMEXPANDING pnmtv = (NM_TREEVIEW FAR *) lParam
pnmtv
Pointer to an NM_TREEVIEW structure. The itemNew member is aTVITEM structure that contains valid information about the parent item in thehItem,state, andlParam members. Theaction member indicates whether the list is to expand or collapse. For a list of possible values, see the description of theTVM_EXPAND message.
。。。。。。。。。
[cpp] view plaincopy
01.typedef struct _NM_TREEVIEW {
02. NMHDR hdr;
03. UINT action;
04. TV_ITEM itemOld;
05. TV_ITEM itemNew;
06. POINT ptDrag;
07.} NM_TREEVIEW;
08.typedef NM_TREEVIEW FAR* LPNM_TREEVIEW;
09.
[cpp] view plaincopy
01.typedef struct _TV_ITEM { tvi
02. UINT mask;
03. HTREEITEM hItem;
04. UINT state;
05. UINT stateMask;
06. LPSTR pszText;
07. int cchTextMax;
08. int iImage;
09. int iSelectedImage;
10. int cChildren;
11. LPARAM lParam; }
12.TV_ITEM, FAR* LPTV_ITEM;
13.
在 TV_ITEM 的 hItem中 存放着要展开项的句柄
解决:查了这么多,其实很简单 代码如下:
[cpp] view plaincopy
01.void CLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
02.{
03. LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
04. // TODO: 在此添加控件通知处理程序代
05. HTREEITEM htree=pNMTreeView->itemNew.hItem; // 这个就是 将要被扩展或收缩节点的句柄
06.
07.。。。
08.}
2 怎么知道CTreeCtrl的一个节点是展开的还是收缩着的
解决:
方法1
[cpp] view plaincopy
01.<strong> (GetItemState(hItem, TVIS_EXPANDED )&TVIS_EXPANDED)!=TVIS_EXPANDED //如果相等,则说明改节点是扩展的,如果不相等,则说明该节点是收缩的</strong>
方法2
响应TVN_ITEMEXPANDING事件时:
[cpp] view plaincopy
01.void CExampleDlg::OnItemexpandingTree1(NMHDR* pNMHDR, LRESULT* pResult)
02.
03.{
04.
05.NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
06.
07.if (pNMTreeView->action == TVE_COLLAPSE) //判断action的值
08.
09.。。。
10.
11.。。。
12.
13.}
3 判断节点是否被扩展过
[cpp] view plaincopy
01.if ((GetTreeCtrl().GetItemState(hItem,TVIS_EXPANDEDONCE )&TVIS_EXPANDEDONCE )!=0 ) //判断是否扩展过一次,若!=0则说明被扩展过
4 使用 CImageList m_ImageList; 加载位图或图标,并将其与树控件联系在一起,由此便可以设置每个节点的图标
[cpp] view plaincopy
01. CImageList m_ImageList;
02.m_ImageList.Create(12,12,ILC_COLORDDB | ILC_MASK, 3, 1);
03.HICON hAdd=::LoadIcon(::AfxGetInstanceHandle(), (LPCTSTR)IDI_ADD);
04.HICON hRemove=::LoadIcon(::AfxGetInstanceHandle(), (LPCTSTR)IDI_REMOVE);
05.HICON hLeaf=::LoadIcon(::AfxGetInstanceHandle(), (LPCTSTR)IDI_LEAF);
06.m_ImageList.Add(hAdd);
07.m_ImageList.Add(hRemove);
08.m_ImageList.Add(hLeaf);
09.GetTreeCtrl().SetImageList(&m_ImageList,TVSIL_NORMAL); // 树控件和图像列表相连
[cpp] view plaincopy
01. m_treeCtrl.SetItemImage(htree,0,0) // 通过SetItemImage(htree,0,0) 设置节点的图标
5 什么时候响应OnItemexpanding 消息
当节点第一次被展开时,才响应此消息。也就是说:当以开后该节点再展开或收缩时,便不再响应此消息了。
6 设置树控件形式为 TVS_HASBUTTONS|TVS_LINESATROOT 时, 树控件节点前才会出现+ - 号
以下为综合例子: 点击按钮上一个 显示该节点的上一个兄弟节点,并更改控件焦点
设置控件样式:
[html] view plaincopy
01.BOOL CTreePathView::PreCreateWindow(CREATESTRUCT& cs)
02.{
03. // TODO: 在此处通过修改
04. // CREATESTRUCT cs 来修改窗口类或样式
05.
06. cs.style|=TVS_HASLINES|TVS_SHOWSELALWAYS; //若是想用CImageList的图标 ,则不要设置为TVS_HASBUTTONS形式
07.
08.
09. return CTreeView::PreCreateWindow(cs);
10.}
点击按钮5(焦点移动到上一个兄弟节点)
[html] view plaincopy
01.void NewImageView::OnBnClickedButton5() // 上一个图
02.{
03. // TODO: 在此添加控件通知处理程序代码
04.
05. CTreePathView * pTree=(CTreePathView* )(((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,0));
06.
07. CTreeCtrl & treeCtrl=pTree->GetTreeCtrl();
08.
09. HTREEITEM hItem=treeCtrl.GetSelectedItem();
10. if (hItem!=NULL)
11. {
12. hItem=treeCtrl.GetNextItem(hItem,TVGN_PREVIOUS);
13.
14. if (hItem!=NULL)
15. {
16. CString str;
17. str=pTree->GetFullPath(hItem);
18. SetImage(str);
19. treeCtrl.SelectItem(hItem);
20. treeCtrl.SetFocus();
21. InvalidateRect(m_ClientRect);
22. }
23. }
24.}
点击按钮6(焦点移动到下一个兄弟节点)
[html] view plaincopy
01.void NewImageView::OnBnClickedButton6() //下一个
02.{
03. // TODO: 在此添加控件通知处理程序代码
04.
05. CTreePathView * pTree=(CTreePathView* )(((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,0));
06. CTreeCtrl & treeCtrl=pTree->GetTreeCtrl();
07. HTREEITEM hItem=treeCtrl.GetSelectedItem();
08.
09. if (hItem!=NULL)
10. {
11. hItem=treeCtrl.GetNextItem(hItem,TVGN_NEXT);
12.
13. if (hItem!=NULL)
14. {
15. CString str;
16. str=pTree->GetFullPath(hItem);
17. SetImage(str);
18.
19. treeCtrl.SelectItem(hItem);
20. treeCtrl.SetFocus();
21. InvalidateRect(m_ClientRect);
22. }
23. }
24.}
7 遍历树控件的所有节点
1) 获得根节点句柄
[cpp] view plaincopy
01.CTreeCtrl& nTreeCtrl=((CImportTreeView*)m_SplitterWnd.GetPane(0,0))->GetTreeCtrl();
02.
03.HTREEITEM hItem;
04.//获得根目录节点
05.hItem = nTreeCtrl.GetRootItem();
06.//遍历树控件节点
07.TreeVisit(&nTreeCtrl,hItem);
2)遍历所有节点
[cpp] view plaincopy
01.void TreeVisit(CTreeCtrl* pCtrl,HTREEITEM hItem)
02.{
03. if(pCtrl->ItemHasChildren(hItem))
04. {
05. HTREEITEM hChildItem = pCtrl->GetChildItem(hItem);
06. while(hChildItem!=NULL)
07. {
08. TreeVisit(pCtrl,hChildItem); //递归遍历孩子节点
09. hChildItem = pCtrl->GetNextItem(hChildItem, TVGN_NEXT);
10. }
11. }
12. else // 对叶子节点进行操作
13. Leaf(pCtrl,hItem);
14.}
8 获得某Item节点的全路径
[cpp] view plaincopy
01.CString m_ParentFolder[10];
02.CString m_OldParentFolder[10];
[cpp] view plaincopy
01.//--------------------将nParent添加到nParentFolder[10]第一位----------------------
02.BOOL AddParentFolder(CString nParentFolder[10], CString nParent)
03.{
04. for(int i=9;i>0;i--)
05. nParentFolder[i]=nParentFolder[i-1];
06. nParentFolder[0]=nParent;
07. return TRUE;
08.}
09.
10.//---------------------nParentFolder[10]中的有效数据整合(加\)---------------------
11.CString AllCString(CString nParentFolder[10])
12.{
13. CString nAllCString=L"";
14. for(int i=0;i<10;i++)
15. {
16. if(nParentFolder[i]==L"") break;
17. nAllCString+=L"\\"+nParentFolder[i];
18. }
19. return nAllCString;
20.}
获得Item节点路径的函数
[cpp] view plaincopy
01.CString GetItemPath(CTreeCtrl* pCtrl,HTREEITEM hItem)
02.{
03. CString nSelItemName=pCtrl->GetItemText(hItem);
04.
05. HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
06.
07. if (parentItem==NULL) //hItem即为根目录
08. return nSelItemName;
09.
10. //清空OLD
11. for(int i=0;i<10;i++) m_OldParentFolder[i]=L"";
12.
13. //m_OldParentFolder 记录上一个节点的父节点
14. for(int i=0;i<10;i++)
15. m_OldParentFolder[i]=m_ParentFolder[i];
16.
17. //m_ParentFolder 记录当前节点的父亲节点
18. for(int i=0;i<10;i++)
19. m_ParentFolder[i]=L"";
20.
21. CString itemPath;
22. CString parentFolder=nSelItemName;
23.
24. //将parentFolder添加到m_ParentFolder[0],其他值依次后移
25. AddParentFolder(m_ParentFolder,parentFolder);
26.
27.
28.
29. // m_PicFolder 为根节点对应的名字
30. while(parentItem!=NULL&&pCtrl->GetItemText(parentItem).Compare(m_PicFolder))
31. {
32. parentFolder=pCtrl->GetItemText(parentItem);
33. AddParentFolder(m_ParentFolder,parentFolder);
34. parentItem=pCtrl->GetParentItem(parentItem);
35.
36. }
37.
38. itemPath.Format(L"%s%s",m_PicFolder,AllCString(m_ParentFolder));
39.
40. //清空OLD
41. for(int i=0;i<10;i++) m_OldParentFolder[i]=L"";
42. //清空
43. for(int i=0;i<10;i++)
44. m_ParentFolder[i]=L"";
45.
46. return itemPath;
47.
48.}
获得叶子节点的函数
[cpp] view plaincopy
01.void Leaf(CTreeCtrl* pCtrl,HTREEITEM hItem)
02.{
03.
04. CString itemName=pCtrl->GetItemText(hItem);
05.
06. // 叶子节点是jpg文件或tif文件
07. if(nSelItemName.Find(L".jpg")!=-1 || nSelItemName.Find(L".tif")!=-1)
08. {
09.
10. //m_OldParentFolder 记录上一个节点的父节点
11. for(int i=0;i<10;i++)
12. m_OldParentFolder[i]=m_ParentFolder[i];
13.
14. //m_ParentFolder 记录当前节点的父亲节点
15. for(int i=0;i<10;i++)
16. m_ParentFolder[i]=L"";
17.
18. CString imgPath=L"";
19. CString parentFolder=itemName;
20.
21. //将parentFolder添加到m_ParentFolder[0],其他值依次后移
22. AddParentFolder(m_ParentFolder,parentFolder);
23.
24. HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
25.
26. // m_imgPath 为根节点对应的名字
27. while(pCtrl->GetItemText(parentItem).Compare(m_imgPath))
28. {
29. parentFolder=pCtrl->GetItemText(parentItem);
30. AddParentFolder(m_ParentFolder,parentFolder);
31. parentItem=pCtrl->GetParentItem(parentItem)
32.
33. }
34.
35. // 获得叶子节点的全路径
36. imgPath.Format(L"%s%s",m_imgPath,AllCString(m_ParentFolder));
37.
38. }
39.
40.
41. // 对imgPath 所指的文件进行操作
42. ShowPic(imgPath);
43.
44.
45.}
9 获得树中所有叶子节点的父目录
即:树中可能有许多枝干,获取这些枝干的路径
[cpp] view plaincopy
01.std::vector<CString> m_BookDirectory; //存放所有叶子节点的父目录
[cpp] view plaincopy
01.void GetBookDirectory(CTreeCtrl* pCtrl,HTREEITEM hItem)
02.{
03.
04. if(pCtrl->ItemHasChildren(hItem))
05. {
06. HTREEITEM hChildItem = pCtrl->GetChildItem(hItem);
07. while(hChildItem!=NULL)
08. {
09. GetBookDirectory(pCtrl,hChildItem); //递归遍历孩子节点
10.
11. if(pCtrl->ItemHasChildren(hChildItem))
12. hChildItem = pCtrl->GetNextItem(hChildItem, TVGN_NEXT);
13. else
14. break;
15. }
16. }
17. else
18. {
19. HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
20. CString bookPath=GetItemPath(pCtrl,parentItem);
21.
22. m_BookDirectory.push_back(bookPath);
23.
24. }
25.}
[cpp] view plaincopy
01.CTreeCtrl& nTreeCtrl=((CImportTreeView*)m_SplitterWnd.GetPane(0,0))->GetTreeCtrl();
02.HTREEITEM hItem;
03.hItem = nTreeCtrl.GetRootItem();
04.
05.m_BookDirectory.clear();
06.GetBookDirectory(&nTreeCtrl,hItem); //获得几本书 及书的路径
- //m_OldParentFolder 记录上一个节点的父节点
- for(int i=0;i<10;i++)
- m_OldParentFolder[i]=m_ParentFolder[i];
- //m_ParentFolder 记录当前节点的父亲节点
- for(int i=0;i<10;i++)
- m_ParentFolder[i]=L"";
- CString imgPath=L"";
- CString parentFolder=itemName;
- //将parentFolder添加到m_ParentFolder[0],其他值依次后移
- AddParentFolder(m_ParentFolder,parentFolder);
- HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
- // m_imgPath 为根节点对应的名字
- while(pCtrl->GetItemText(parentItem).Compare(m_imgPath))
- {
- parentFolder=pCtrl->GetItemText(parentItem);
- AddParentFolder(m_ParentFolder,parentFolder);
- parentItem=pCtrl->GetParentItem(parentItem)
- }
- // 获得叶子节点的全路径
- imgPath.Format(L"%s%s",m_imgPath,AllCString(m_ParentFolder));
- }
- // 对imgPath 所指的文件进行操作
- ShowPic(imgPath);
- }
void Leaf(CTreeCtrl* pCtrl,HTREEITEM hItem)
{
CString itemName=pCtrl->GetItemText(hItem);
// 叶子节点是jpg文件或tif文件
if(nSelItemName.Find(L".jpg")!=-1 || nSelItemName.Find(L".tif")!=-1)
{
//m_OldParentFolder 记录上一个节点的父节点
for(int i=0;i<10;i++)
m_OldParentFolder[i]=m_ParentFolder[i];
//m_ParentFolder 记录当前节点的父亲节点
for(int i=0;i<10;i++)
m_ParentFolder[i]=L"";
CString imgPath=L"";
CString parentFolder=itemName;
//将parentFolder添加到m_ParentFolder[0],其他值依次后移
AddParentFolder(m_ParentFolder,parentFolder);
HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
// m_imgPath 为根节点对应的名字
while(pCtrl->GetItemText(parentItem).Compare(m_imgPath))
{
parentFolder=pCtrl->GetItemText(parentItem);
AddParentFolder(m_ParentFolder,parentFolder);
parentItem=pCtrl->GetParentItem(parentItem)
}
// 获得叶子节点的全路径
imgPath.Format(L"%s%s",m_imgPath,AllCString(m_ParentFolder));
}
// 对imgPath 所指的文件进行操作
ShowPic(imgPath);
}
9 获得树中所有叶子节点的父目录
即:树中可能有许多枝干,获取这些枝干的路径
- std::vector<CString> m_BookDirectory; //存放所有叶子节点的父目录
std::vector<CString> m_BookDirectory; //存放所有叶子节点的父目录
- void GetBookDirectory(CTreeCtrl* pCtrl,HTREEITEM hItem)
- {
- if(pCtrl->ItemHasChildren(hItem))
- {
- HTREEITEM hChildItem = pCtrl->GetChildItem(hItem);
- while(hChildItem!=NULL)
- {
- GetBookDirectory(pCtrl,hChildItem); //递归遍历孩子节点
- if(pCtrl->ItemHasChildren(hChildItem))
- hChildItem = pCtrl->GetNextItem(hChildItem, TVGN_NEXT);
- else
- break;
- }
- }
- else
- {
- HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
- CString bookPath=GetItemPath(pCtrl,parentItem);
- m_BookDirectory.push_back(bookPath);
- }
- }
void GetBookDirectory(CTreeCtrl* pCtrl,HTREEITEM hItem)
{
if(pCtrl->ItemHasChildren(hItem))
{
HTREEITEM hChildItem = pCtrl->GetChildItem(hItem);
while(hChildItem!=NULL)
{
GetBookDirectory(pCtrl,hChildItem); //递归遍历孩子节点
if(pCtrl->ItemHasChildren(hChildItem))
hChildItem = pCtrl->GetNextItem(hChildItem, TVGN_NEXT);
else
break;
}
}
else
{
HTREEITEM parentItem=pCtrl->GetParentItem(hItem);
CString bookPath=GetItemPath(pCtrl,parentItem);
m_BookDirectory.push_back(bookPath);
}
}
- CTreeCtrl& nTreeCtrl=((CImportTreeView*)m_SplitterWnd.GetPane(0,0))->GetTreeCtrl();
- HTREEITEM hItem;
- hItem = nTreeCtrl.GetRootItem();
- m_BookDirectory.clear();
- GetBookDirectory(&nTreeCtrl,hItem); //获得几本书 及书的路径