设计界面如上:
本工程功能如下:
当工号、姓名、工资中输入数据后,并在树控件中选择一个二级节点后,把数据显示在列表中,并将数据写入新创建树节点目录文件中。
在树控件中选择一个二级节点后,将该节点对应文件夹数据输出到列表中
新建一个对话框工程,控件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;
};
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;
}