www.gusucode.com > VC++树控件——动态树形菜单实例-源码程序 > VC++树控件——动态树形菜单实例-源码程序/code/TreeCtrlEx.cpp

    //Download by http://www.NewXing.com
// TreeCtrlEx.cpp : implementation file
//

#include "stdafx.h"
#include "TreeCtrlEx.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Added

const int ROWNUM = 4;
const int COLNUM = 4;

//服务名称
char * const TREE_SERVICES[ROWNUM] = 
	{
		"家人", //1
		"朋友(0/3)", //2
		"同事(0/3)", //3		
		"其它", //4			
	};

//子项目
char * const TREE_SERVICES_ITEMS[ROWNUM][COLNUM] =
	{		
		{"","","",""},//	21	
		{"张大民","梁朝伟","周润发",""},	//11
		{"Shaq","Lisa","Mark",""},	//31	
		{"","","",""},	//41			
	
	};

/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlEx

CTreeCtrlEx::CTreeCtrlEx()
{
	
}

CTreeCtrlEx::~CTreeCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CTreeCtrlEx, CTreeCtrl)
	//{{AFX_MSG_MAP(CTreeCtrlEx)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlEx message handlers

void CTreeCtrlEx::LoadItems()
{
	int	i,j;
	//树控制项目句柄
	HTREEITEM		hCur,hRoot;
	//插入数据项数据结构
	TV_INSERTSTRUCT TCItem;
	
	//删除
	//DeleteAllItems();

	//获取树控制原风格
	DWORD dwStyles = GetWindowLong(m_hWnd,GWL_STYLE);
	
	//设置新的风格
	dwStyles |= TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT|TVS_EDITLABELS;
	//设置风格
	SetWindowLong(m_hWnd,GWL_STYLE,dwStyles);

	//增加根项
	TCItem.hParent = TVI_ROOT;
	//在最后项之后		
	TCItem.hInsertAfter = TVI_LAST;
	//设屏蔽	
	TCItem.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
	TCItem.item.pszText = _T("联系人");
	//序号
	TCItem.item.lParam = 0;
	//正常图标		
	TCItem.item.iImage = 0;
	//选中时图标	
	TCItem.item.iSelectedImage = 0;

	//返回根项句柄		
	hRoot = InsertItem(&TCItem);
		
	for(i=0;i<ROWNUM;i++){
		
		TCItem.hParent=hRoot;
		
		TCItem.item.pszText = TREE_SERVICES[i];
		
		TCItem.item.lParam = (i+1)*10;//子项序号
		
		hCur = InsertItem(&TCItem);
		
		for(j=0;j<COLNUM;j++){//增加各产品

			if(TREE_SERVICES_ITEMS[i][j] == "") continue;
			
			TCItem.hParent=hCur;
			
			TCItem.item.pszText=TREE_SERVICES_ITEMS[i][j];
			
			TCItem.item.lParam=(i+1)*10+(j+1);//子项序号
			
			InsertItem(&TCItem);
		}
	}
	Expand(hRoot,TVE_EXPAND);//展开上一级树
}

/***************************************************************
*
* 名称:FindItem
*
* 功能:在树控制中根据数据项名称查找数据项
*
* 参数:item    - 要查询的数据项及其子数据项
*
*       strText - 要查询的数据项名称
*
* 返回值:NULL  - 没找到
*      
*        (非空的HTREEITEM ) - 找到
*
***************************************************************/
HTREEITEM CTreeCtrlEx::FindItem(HTREEITEM item, CString strText)
{
	HTREEITEM hFind;	

	if(item == NULL)
		return NULL;

	while(item!=NULL)
	{
		if(GetItemText(item) == strText)
			return item;

		if(ItemHasChildren(item))
		{
			item = GetChildItem(item);
			hFind = FindItem(item,strText);		
			if(hFind)
			{
				return hFind;		
			}
			else
				item= GetNextSiblingItem(GetParentItem(item));

		}
		else
		{
			item = GetNextSiblingItem(item);
			if(item==NULL)
				return NULL;
		}
		
	}

	return item;
}