树控件示例

设计界面如上:

本工程功能如下:

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

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


新建一个对话框工程,控件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


添加树控件消息响应函数:
void CTreeTestDlg::OnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMTREEVIEW pTree = reinterpret_cast(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(iEnableWindow(FALSE);//m_bFlag=TRUE;
}


看一下运行效果:





本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部