中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > WINDOWS标准界面元素
树控件的应用 -- 求子树节点的集
作者:未知 时间:2005-07-20 14:11 出处:VC知识库 责编:chinaitpower
              摘要:树控件的应用 -- 求子树节点的集

树控件的应用 -- 求子树节点的集
作者:XuFeng Yuan

下载本文示例代码

本人,在去年已经发表一篇关于使用数据库内记录的内容,来创建树控件的节点的文章--《按数据库记录构建树控件》(),
由于这篇文件里,对于点击树的某一节点后,显示当前节点的子节点的集上,是使用启动数据库的方法,造成了数据处理复杂,而且程序发应速度慢的问题;经过我再三考虑,将程序修改如下:

一、 将ReturnTreeChilds(CString strCurItem);代码修改如下:

//----------------提取当前所选择项的子项文本所组成的字符串------------------------
CString CTreeDataDlg::ReturnTreeChilds(HTREEITEM hP)
{
	CString text="";
	//取出当前的Item值
	text=m_ctrlTree.GetItemText(hP);
	//取子项的Item值
	HTREEITEM hC;
	hC=m_ctrlTree.GetChildItem(hP);

	while(true)
	{
		//-----------判断是否有子项,如果有,则递归调用-----------
		if (m_ctrlTree.GetChildItem(hC)!=NULL)
		{ text+=(","+ReturnTreeChilds(hC));}
		else
		{text+=(","+m_ctrlTree.GetItemText(hC));}
		//----------------判断是否有兄弟项,如果有,则将它的内容添加进去---
		if (m_ctrlTree.GetNextSiblingItem(hC)==NULL)
			break;
		HTREEITEM hBC;
		hBC=m_ctrlTree.GetNextSiblingItem(hC);
		hC=hBC;
	}
	return text;
}
注:
1. 程序调用时,先将当前节点的值,将值保存到text里;
2. 由当前项的句柄,取它的子项的句柄;这时候存在有或者没有子节点的情况;
这时候,我们可以使用m_ctrlTree.GetChildItem(hC)!=NULL来判断当前这个节点有没有子节点;如果有子节点,则循环调用ReturnTreeChilds(HTREEITEM hP)函数;如果没有,则将此节点的值添加到text里。
3. 判断节点有没有兄弟节点,如果有兄弟节点,则跳至第2步,循环执行;如果没有,则跳出while循环。
4. 返回text值。

二、 将void CTreeDataDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)代码修改如下:

void CTreeDataDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	//--------------------------------------------------------
	hTreeCurrent=m_ctrlTree.GetSelectedItem ();
	hTreeParent=m_ctrlTree.GetParentItem(m_ctrlTree.GetSelectedItem ());
	//-------------------树型控件的图标更改---------
	m_ctrlTree.SetItemImage(hTreeCurrent,1,true );
	//----------------------------------------------	
	TreeParent=m_ctrlTree.GetItemText (hTreeParent);
	hTreeCurrent=m_ctrlTree.GetSelectedItem ();
	//---------------------处理ListTree中的相应显示内容--------------
	//-----------------获取当前的Item和子Items-----------------------
	if (m_ctrlTree.GetChildItem(hTreeCurrent)!=NULL)
	{//-------------如果,有子项则进行递归操作,返回自己和子项的值---------
		m_strEdit=ReturnTreeChilds(hTreeCurrent);	
	}
	else
	{
		m_strEdit=m_ctrlTree.GetItemText(hTreeCurrent);
	}
	UpdateData(false);//子项内容显示到Edit控件中	
	//---------------------------------------------------
	*pResult = 0;
}
这样,就可以实现点击树节点时,程序自动去搜集当前节点与子节点的值集。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有