(1)Check Boxes :默认为false,如果选择为true的话每个节点前面会带有一个方框
(2)Edit Labels:默认为false,如果选择为true的话每个节点的名称可以编辑修改
(3)Has Buttons: 默认为false,如果选择为true的话展开的节点前面会有加号或者减号
(4)Has Lines:默认为false,如果选择为true的话会出现线如下所示
(5) Lines At Root:默认为false,选择为true的话从根节点就会有线
(1)给树形控件添加变量
(2)插入节点
//添加节点
//在树形控件中每一个结点都有一个句柄(HTREEITEM),
//同时插入结点时必须提供父结点句柄,
//(其中根Root结点只有一个,既不可以添加也不可以删除)
//利用HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
//可以插入一个结点,pszItem为显示的字符,
//hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。
hroot = m_Tree.InsertItem(_T("父亲"));
HTREEITEM hroot_sub1 = m_Tree.InsertItem(_T("儿子1"), hroot);
HTREEITEM hroot_sub2 = m_Tree.InsertItem(_T("儿子2"), hroot);
HTREEITEM hroot_sub3 = m_Tree.InsertItem(_T("儿子3"), hroot);
HTREEITEM hroot_sub1_sub1 = m_Tree.InsertItem(_T("孙子1-1"), hroot_sub1);
HTREEITEM hroot_sub1_sub2 = m_Tree.InsertItem(_T("孙子1-2"), hroot_sub1);
HTREEITEM hroot_sub3_sub1 = m_Tree.InsertItem(_T("孙子3-1"), hroot_sub3);
HTREEITEM hroot_sub3_sub2 = m_Tree.InsertItem(_T("孙子3-2"), hroot_sub3);
(3)获取节点的文本内容
//获得节点的文本内容
CString hroot_text = m_Tree.GetItemText(hroot);
MessageBox(hroot_text);
(4)设置节点的文本内容
//设置节点的文本内容
m_Tree.SetItemText(hroot_sub1_sub1, _T("我叫孙子"));
(5)获得当前选中的节点
//获得选中的节点
HTREEITEM hselected = m_Tree.GetSelectedItem();
//获得选中节点上的文本内容
CString hselected_text = m_Tree.GetItemText(hselected);
MessageBox(hselected_text);
(6)修改当前选中的节点
//聚焦
m_Tree.SetFocus();
//修改选中的节点
m_Tree.SelectItem(hroot);
(7)删除节点
//删除某个节点,根据句柄来删除
//如果删除的节点有子节点,也会同时被删除掉
m_Tree.DeleteItem(hroot_sub3);
//删除所有节点
m_Tree.DeleteAllItems();
默认上面的情况都是针对单选,那么Tree树形控件支不支持多选呢?答案是:默认不支持
不过可以通过给节点前面加上 CheckBox 复选框来解决!
新建一个成员函数来写递归函数来遍历树形控件
//树形递归函数
void CMFC_Test1Dlg::EnumTreeItem(HTREEITEM hitem){
if (!hitem) return;
//如果当前节点被勾选
if (m_Tree.GetCheck(hitem)){
//获得节点的文本内容
CString hitem_text = m_Tree.GetItemText(hitem);
MessageBox(hitem_text);
}
//获得子节点
HTREEITEM hitem_child = NULL;
if (m_Tree.ItemHasChildren(hitem)){
//获取子节点
hitem_child = m_Tree.GetChildItem(hitem);
//如果继续存在子节点
do
{
//子节点进入递归
EnumTreeItem(hitem_child);
//找到子节点的兄弟节点,如果为空则跳出
hitem_child = m_Tree.GetNextItem(hitem_child, TVGN_NEXT);;
} while (hitem_child);
}
}
添加代码
添加一个Button控件来控制展开与合并
void CMFC_Test1Dlg::OnBnClickedButton20()
{
// TODO: 在此添加控件通知处理程序代码
static UINT opcode = TVE_EXPAND;
//扩展父节点
ExpendTreeItem(hroot, opcode);
//如果是展开的则设置为合并
opcode = (opcode == TVE_EXPAND) ? TVE_COLLAPSE : TVE_EXPAND;
}
合并展开函数递归实现
void CMFC_Test1Dlg::ExpendTreeItem(HTREEITEM hitem, UINT opcode){
if (!hitem) return;
//进行展开
m_Tree.Expand(hitem, opcode);
//如果当前节点存在子节点
if (m_Tree.ItemHasChildren(hitem)){
//获得子节点
HTREEITEM hchild = m_Tree.GetChildItem(hitem);
while (hchild){
//扩展或者合并子节点
ExpendTreeItem(hchild, opcode);
//子节点完了之后转到相邻节点
hchild = m_Tree.GetNextItem(hchild,TVGN_NEXT);
}
}
}
(1)设置树形控件的label可以编辑
(2)添加变量事件
开始编辑事件
结束编辑事件
(3)代码完成
//开始编辑标签
void CMFC_Test1Dlg::OnTvnBeginlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//设置只允许输入的字符长度
m_Tree.GetEditControl()->LimitText(5);
*pResult = 0;//如果该参数=1,则不能编辑
}
//结束编辑标签
void CMFC_Test1Dlg::OnTvnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//如果节点内容不为空以及长度大于0
if (pTVDispInfo->item.pszText && _tcslen(pTVDispInfo->item.pszText)>0){
//设置节点的文本内容
m_Tree.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);
}
*pResult = 0;
}
给每个节点前面可以添加图标,当选中和未选中状态下显示不同的图标
(1)添加资源
将几个ico图标文件添加到工程资源中,ID分别为:IDI_ICON1、IDI_ICON2、IDI_ICON3
导入资源到项目资源钟
(2)添加变量并且完成代码
添加图片资源变量CImageList
//定义图片资源变量
CImageList m_imglist;
创建图片资源并且和树形控件变量绑定
//创建资源,参数依次为长、宽、标志、初始化几个、增幅
m_imglist.Create(16,16,ILC_MASK|ILC_COLOR32,2,1);
//添加资源
m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
//树形控件与图片资源关联,图标的类型
m_Tree.SetImageList(&m_imglist,TVSIL_NORMAL);
设置节点的选中和未选中的图标序号
在插入节点的时候就可以设置图标了
//参数一次为节点的名称,选中时的图标序号,未选中时的图标序号
hroot = m_Tree.InsertItem(_T("父亲"),0,1);
HTREEITEM hroot_sub1 = m_Tree.InsertItem(_T("儿子1"),0,1, hroot);
HTREEITEM hroot_sub2 = m_Tree.InsertItem(_T("儿子2"), 0, 1, hroot);