树控件示例

设计界面如上:

本工程功能如下:

当工号、姓名、工资中输入数据后,并在树控件中选择一个二级节点后,把数据显示在列表中,并将数据写入新创建树节点目录文件中。

在树控件中选择一个二级节点后,将该节点对应文件夹数据输出到列表中


新建一个对话框工程,控件ID如下:

工号编辑框:IDC_EDIT_NUM   

姓名编辑框:IDC_EDIT_NAME                                 
工资编辑框:IDC_EDIT_SAL                    
树控件:IDC_TREE1       ,关联控件变量m_tree,

树控件设置属性:

Has buttons:节点有加减号按钮

Has Lines:子节点之间有虚线相连

Line at Root:根节点有虚线和其它相连

Show selection always:一直显示选中项

Border:有边框          

列表控件:IDC_LIST1  ,关联控件变量m_list ,设置属性view:Report报表,Show selection always:True                   
添加按钮:IDC_BTN_ADD  ,设置初始属性  Disabled:true不可用                            
路径静态文本框:IDC_STATIC_PATH


定义一个结构体以便文件读写操作:

struct SInfo
{
int nNum;
char sName[20];
float fSal;
};


在OnInitDialog中初始化树控件和列表控件:
	m_list.InsertColumn(0,"工号",0,150);
	m_list.InsertColumn(1,"姓名",0,150);
	m_list.InsertColumn(2,"工资",0,150);
	//设置列表框扩展风格
	m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

	//总节点
	HTREEITEM hRoot=m_tree.InsertItem("总公司");
	//添加一级节点,在总节点下
	HTREEITEM hItem=m_tree.InsertItem("一分公司",hRoot);
	//添加二级节点,在一级节点"一分公司"下
	m_tree.InsertItem("行政部",hItem);
	m_tree.InsertItem("市场部",hItem);
	m_tree.InsertItem("就业部",hItem);
	m_tree.Expand(hItem,TVE_EXPAND);  //默认展开一级节点"一分公司"下的项

	hItem=m_tree.InsertItem("二分公司",hRoot);
	//添加二级节点,在一级节点"二分公司"下
	m_tree.InsertItem("行政部",hItem);
	m_tree.InsertItem("广告部",hItem);
	m_tree.InsertItem("市场部",hItem);
	m_tree.InsertItem("就业部",hItem);
	m_tree.Expand(hItem,TVE_EXPAND);  //默认展开一级节点"二分公司"下的项
	m_tree.Expand(hRoot,TVE_EXPAND);  //默认展开根节点下的项


添加小函数:
//获取选中节点的深度
int CTreeTestDlg::GetDepth(HTREEITEM hItem)
{
	int i=0;
	while(hItem)
	{
		//获取当前节点的父节点,赋给hItem
		//最终根节点返回1,一级节点返回2,二级节点返回3...
		hItem=m_tree.GetParentItem(hItem);
		i++;
	}
	return i;
}

//获取选中节点的路径
CString CTreeTestDlg::GetPaht(HTREEITEM hItem)
{
	CString str;
	while(hItem)
	{
		str=m_tree.GetItemText(hItem)+'\\'+str;
		hItem=m_tree.GetParentItem(hItem);  //获取父节点
	}
	return str;
}

//单击不同的部门加载相应的数据输出到List中
void CTreeTestDlg::LoadData(void)
{
	m_list.DeleteAllItems();  //清空列表框中的数据
	//获取树控件选中节点
	HTREEITEM hItem=m_tree.GetSelectedItem();
	int nDepth=GetDepth(hItem);  //获取树节点深度
	if(nDepth!=3)   //如果选中节点不是二级节点,返回
		return;
	CString szPath=GetPaht(hItem);  //获取选中树节点目录
	CFile file;
	if(!file.Open(szPath+"memb.dat",CFile::modeRead))
		return;
	SInfo info;
	int i=0;
	CString str;
	while(file.Read(&info,sizeof(info))>0)
	{
		str.Format("%d",info.nNum);
		m_list.InsertItem(i,str);

		m_list.SetItemText(i,1,info.sName);

		str.Format("%0.2f",info.fSal);
		m_list.SetItemText(i,2,str);

		i++;
	}

	file.Close();
}

//创建文件夹
BOOL CTreeTestDlg::MakeDir(CString &szPath)
{
	int i=0;
	while((i=szPath.Find('\\',i))>0)
		CreateDirectory(szPath.Left(i++),NULL);
	return TRUE;
}

//将List中的数据写入树目录文件夹下的文件中
void CTreeTestDlg::SaveData(void)
{
	CString szPath;
	GetDlgItemText(IDC_STATIC_PATH,szPath);//获得路径静态文本
	CString szFile=szPath+"memb.dat";  
	CFileFind ff;
	if(!ff.FindFile(szFile))  //查找文件memb.dat是否存在
		MakeDir(szPath);      //创建文件夹

	CFile file;
	//以创建并写入的方式打开文件
	if(!file.Open(szFile,CFile::modeCreate | CFile::modeWrite))
	{
		MessageBox("保存时出错!");
		return ;
	}
	int i=0,nCount=m_list.GetItemCount();
	SInfo info;
	//将m_list中的数据写入文件中
	while(i<nCount)
	{
		info.nNum=atoi(m_list.GetItemText(i,0));
		strcpy(info.sName,m_list.GetItemText(i,1));
		info.fSal=atof(m_list.GetItemText(i,2));
		file.Write(&info,sizeof(info));
		++i;
	}
	file.Close();
	//m_bFlag=FALSE;
}


添加树控件消息响应函数:
void CTreeTestDlg::OnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pTree = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	
	HTREEITEM hItem=pTree->itemNew.hItem;  //获得当前选中树节点
	int nDepth=GetDepth(hItem);  //获取选中树节点深度
	CString szNum,szName,szSal;
	GetDlgItemText(IDC_EDIT_NUM,szNum);
	GetDlgItemText(IDC_EDIT_NAME,szName);
	GetDlgItemText(IDC_EDIT_SAL,szSal);
	if(szNum!="" && szName!="" && szSal!="")//当文本框都输入了数据时
	{
		//如果选中的树节点是二级节点就激活“添加”按钮,否则禁用该按钮
		GetDlgItem(IDC_BTN_ADD)->EnableWindow(nDepth==3);
	}
	
	//将选择的树节点目录显示在静态文本框中
	SetDlgItemText(IDC_STATIC_PATH,GetPaht(hItem));
	LoadData(); //将当前选中树节点下文件的数据输出到List中

	*pResult = 0;
}

“添加”按钮响应函数:
void CTreeTestDlg::OnBnClickedBtnAdd()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	int i=0;
	//获得列表框数据行数
	int nCount=m_list.GetItemCount();
	GetDlgItemText(IDC_EDIT_NUM,str);//获取工号
	while(i<nCount)
	{
		//检查工号是否存在
		if(m_list.GetItemText(i,0)==str)
		{
			AfxMessageBox("工号已存在");
			return;
		}
		i++;
	}

	if(IDCANCEL==AfxMessageBox("添加数据到树目录文件夹吗?"))
		return;

	//将编辑框中的数据添加到List末尾
	m_list.InsertItem(nCount,str);
	GetDlgItemText(IDC_EDIT_NAME,str);
	m_list.SetItemText(nCount,1,str);
	GetDlgItemText(IDC_EDIT_SAL,str);
	m_list.SetItemText(nCount,2,str);

	//将List中的数据写入树目录文件夹下的文件中
	SaveData();

	//添加数据后清空编辑框,以便下次输入
	SetDlgItemText(IDC_EDIT_NUM,"");
	SetDlgItemText(IDC_EDIT_NAME,"");
	SetDlgItemText(IDC_EDIT_SAL,"");

	//禁用“添加”按钮
	GetDlgItem(IDC_BTN_ADD)->EnableWindow(FALSE);

	//m_bFlag=TRUE;
}


看一下运行效果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值