树控件示例

来源:互联网 发布:u盘低格后数据恢复 编辑:程序博客网 时间:2024/06/06 07:44

设计界面如上:

本工程功能如下:

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

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


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


看一下运行效果:





原创粉丝点击