树控件示例
设计界面如上:
本工程功能如下:
当工号、姓名、工资中输入数据后,并在树控件中选择一个二级节点后,把数据显示在列表中,并将数据写入新创建树节点目录文件中。
在树控件中选择一个二级节点后,将该节点对应文件夹数据输出到列表中
新建一个对话框工程,控件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;
} 看一下运行效果:
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
