【MFC开发(16)】树形控件Tree Control

【MFC开发(16)】树形控件Tree Control_第1张图片【MFC开发(16)】树形控件Tree Control_第2张图片

1.树形控件的属性配置

(1)Check Boxes :默认为false,如果选择为true的话每个节点前面会带有一个方框

【MFC开发(16)】树形控件Tree Control_第3张图片 【MFC开发(16)】树形控件Tree Control_第4张图片

(2)Edit Labels:默认为false,如果选择为true的话每个节点的名称可以编辑修改

【MFC开发(16)】树形控件Tree Control_第5张图片

(3)Has Buttons: 默认为false,如果选择为true的话展开的节点前面会有加号或者减号

【MFC开发(16)】树形控件Tree Control_第6张图片【MFC开发(16)】树形控件Tree Control_第7张图片

 (4)Has Lines:默认为false,如果选择为true的话会出现线如下所示

 【MFC开发(16)】树形控件Tree Control_第8张图片【MFC开发(16)】树形控件Tree Control_第9张图片

 (5) Lines At Root:默认为false,选择为true的话从根节点就会有线

【MFC开发(16)】树形控件Tree Control_第10张图片

2.常用函数方法

 (1)给树形控件添加变量

 【MFC开发(16)】树形控件Tree Control_第11张图片

 (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);

【MFC开发(16)】树形控件Tree Control_第12张图片

(3)获取节点的文本内容

//获得节点的文本内容
	CString hroot_text = m_Tree.GetItemText(hroot);
	MessageBox(hroot_text);

 (4)设置节点的文本内容

	//设置节点的文本内容
	m_Tree.SetItemText(hroot_sub1_sub1, _T("我叫孙子"));

【MFC开发(16)】树形控件Tree Control_第13张图片

 (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();

3.遍历树形控件

默认上面的情况都是针对单选,那么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);
	}
}

【MFC开发(16)】树形控件Tree Control_第14张图片

4.完全展开/合并所有节点

添加代码

添加一个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);
		}
	}
}

【MFC开发(16)】树形控件Tree Control_第15张图片【MFC开发(16)】树形控件Tree Control_第16张图片

 
5.如何编辑节点的文本内容以及更改保存

(1)设置树形控件的label可以编辑

【MFC开发(16)】树形控件Tree Control_第17张图片

(2)添加变量事件

开始编辑事件

 【MFC开发(16)】树形控件Tree Control_第18张图片

结束编辑事件

 【MFC开发(16)】树形控件Tree Control_第19张图片

 (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;
}

【MFC开发(16)】树形控件Tree Control_第20张图片

6.插入带图标的节点

给每个节点前面可以添加图标,当选中和未选中状态下显示不同的图标

(1)添加资源

将几个ico图标文件添加到工程资源中,ID分别为:IDI_ICON1、IDI_ICON2、IDI_ICON3

【MFC开发(16)】树形控件Tree Control_第21张图片

导入资源到项目资源钟

【MFC开发(16)】树形控件Tree Control_第22张图片

【MFC开发(16)】树形控件Tree Control_第23张图片 

 (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);

 【MFC开发(16)】树形控件Tree Control_第24张图片

你可能感兴趣的:(MFC开发,p2p,网络协议,网络)