TreeCtrl
1.获取当前选择的节点名
CPoint point;
GetCursorPos(&point); // 当前鼠标坐标
m_tree.ScreenToClient( &point);
HTREEITEM hTest=m_tree.HitTest(point, &nFlag);
if(hTest)
{
m_tree.SelectItem(hTest);
CString strx,str=m_tree.GetItemText(hTest);
AfxMessageBox(str);
}
2.TREECTRL加节点图标
step1: 创建位图资源IDB_BITMAP1、IDB_BITMAP2(假设为16x16)
step3: 添加类成员 CImageList m_ImageList;
step3: OnInitDialog()
{
m_imageList.Create(16, 16, ILC_COLORDDB | ILC_MASK, 0, 1);
CBitmap bm1, bm2;
bm1.LoadBitmap(IDB_BITMAP1);
bm2.LoadBitmap(IDB_BITMAP2);
m_imageList.Add(&bm1, RGB(192, 192, 192));
m_imageList.Add(&bm2, RGB(192, 192, 192));
m_tree.SetImageList(&m_imageList, TVSIL_NORMAL);
}
step4:在插入节点时指定图标
m_tree.InsertItem(str1,0,0,hItem1);//参数2:图标索引;参数3:选中节点时的图标索引
m_tree.InsertItem(str2,1,1,hItem2);
3.展开具有2级子节点的树
HTREEITEM hc=m_tree.GetChildItem(hroot);
m_tree.Expand(hroot,TVE_EXPAND);
m_tree.Expand(hc,TVE_EXPAND);
while((hc=m_tree.GetNextItem(hc,TVGN_NEXT))!=NULL)
m_tree.Expand(hc,TVE_EXPAND);
4.右键编辑TREECTRL节点文本
(1)响应右键消息
void CForTestDlg::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
m_tree.ModifyStyle(NULL,TVS_EDITLABELS); //设置编辑风格
HTREEITEM hItem=m_tree.GetSelectedItem();
m_tree.EditLabel(hItem);
*pResult = 0;
}
(2)响应TVN_BEGINLABELEDIT消息
void CForTestDlg::OnEndlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pTVDispInfo->item.pszText!=NULL) //未取消编辑
m_tree.SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);
*pResult = 0;
}
(3)
void CForTestDlg::OnOK()
{
SetFocus(); //响应ENTER键
return;
}
1.GetParentItem取得父节点
2.GetChildItem判断父节点是否有子节点
3.GetNextItem依次取出所有子节点,加一个计数
判断每次取出的节点和当前节点是否是同一节点
是第一个节点,你看一下csdn中的例题就知道了!
// The pointer to my tree control.
extern CTreeCtrl* pmyTreeCtrl;
// The item whose children will be deleted.
extern HTREEITEM hmyItem;
// Delete all of the children of hmyItem.
if (pmyTreeCtrl->ItemHasChildren(hmyItem))
{
HTREEITEM hNextItem;
HTREEITEM hChildItem = pmyTreeCtrl->GetChildItem(hmyItem);
while (hChildItem != NULL)
{
hNextItem = pmyTreeCtrl->GetNextItem(hChildItem, TVGN_NEXT);
pmyTreeCtrl->DeleteItem(hChildItem);
hChildItem = hNextItem;
}
}
//插入数据
HTREEITEM hParent = m_TreeCtrl.InsertItem(_T("Root"),TVI_ROOT,TVI_LAST);
HTREEITEM hChild1 = m_TreeCtrl.InsertItem(_T("Child1"),hParent);
HTREEITEM hChild2 = m_TreeCtrl.InsertItem(_T("Child2"),hParent);
//展开树
m_TreeCtrl.SetItemState(hParent,TVIS_EXPANDED,TVIS_EXPANDED);或
m_TreeCtrl.Expand(hParent,TVE_EXPAND);(注:第一种一开始好像无法选中子项)
//取得当前选中的Item
HTREEITEM hSel = m_TreeCtrl.GetSelectedItem();
m_TreeCtrl.InsertItem(_T("aaa"),hSel); //在选中项下插入新的Item
m_TreeCtrl.SetRedraw(TRUE); //刷新
HTREEITEM hParent = m_TreeCtrl.GetRootItem(); //定位到根目录
m_TreeCtrl.InsertItem(_T("Item"),hParent); //在根目录下插入新项
//查找指定的Item
CString str = _T("Child1");
HTREEITEM hParent = m_TreeCtrl.GetRootItem();
while (hParent!=NULL)
{
if (strcmp(m_TreeCtrl.GetItemText(hParent),str)==NULL) //找到
{
break;
}
else
{
hParent = m_TreeCtrl.GetNextVisibleItem(hParent); //查找下一Item
}
}
//动态创建一树型控件
DWORD dwStyle = WS_CHILD |WS_VISIBLE | WS_BORDER | TVS_HASBUTTONS |TVS_HASLINES;
m_Tree.Create(dwStyle,rcTree,this,0x00016);
m_Tree.InsertItem(_T("Root"));