VC++树控件是较为复杂的控件之一 也许读取它的项目相对来说比较容易 但保存它的结构信息再读取出来也许要花更多的时间.问题是如果保存结构信息?下面代码完全做到了这一点 可能算法有些笨笨 不知道其它人是如何来做到的 我只能用这样的方法了.
//保存一个树控件m_tree_map_list结构信息到"D:/x.ini"文件中.
//首先在窗体上创建一个树控件 并创建一个成员变量为m_tree_map_list 然后在一个"保存"按钮中添加以下代码
//天枫十一郎
WritePrivateProfileString("tree",NULL,NULL,"D://x.ini");//清除原有信息文件
UINT sum=0;//项目总数
int parent=0;//父项标识
CString itemp,temp_01,temp_02;//临时变量
//--------------------------------------------------
HTREEITEM m_htreeChildItem;//下一个子项
HTREEITEM m_htreeSiblingItem;//下一个兄项
HTREEITEM m_htreeParentItem;//下一个父项
HTREEITEM m_htreeBS;//当前操作的项
m_htreeBS= m_tree_map_list.GetRootItem();//取得主项的信息
//判断当前子项是否有效
while(m_htreeBS)
{
sum++; //项目总数增加
parent++;//父项标识改增加
itemp.Format("%d",sum);
temp_01.Format("%d",parent);//保存父项标识
WritePrivateProfileString("tree","id_parent_"+itemp,temp_01,"D://x.ini");//写入当前项的父项标识(根据此信息来读取)
m_tree_map_list.Expand(m_htreeBS,TVE_EXPAND);//展开此项
m_htreeChildItem=m_tree_map_list.GetChildItem(m_htreeBS);//取得当前项的子项
//判断如果没有子项了 则进行兄项查询
while(!m_htreeChildItem)
{
m_htreeSiblingItem=m_tree_map_list.GetNextSiblingItem(m_htreeBS);//取得当前操作项的下一个兄项
//判断是否有兄项
if (m_htreeSiblingItem)
{
parent--;//父项标识减少
m_htreeChildItem=m_htreeSiblingItem;
}else{
//没有兄项则进行父项查询
m_htreeParentItem=m_tree_map_list.GetParentItem(m_htreeBS);
if (m_htreeParentItem)
{
m_htreeBS=m_htreeParentItem;//改变当前操作的项
parent--;
}else
//没有父项则退出
break;
}
//--------
}
m_htreeBS=m_htreeChildItem;//改变当前操作项
}
//保存项目总数
itemp.Format("%d",sum);
WritePrivateProfileString("tree","sum",itemp,"D://x.ini");
//然后再在一个"读取"按钮里添加以下代码
m_tree_map_list.DeleteAllItems();//清除所有项目
UINT sum=0;//项目总数
int parent=0;//父项标识
int bs=0;
char itemp[255];
CString temp_01,temp_02;
//-----------------
HTREEITEM m_hRoot;//主项
HTREEITEM m_htreeBS;//当前操作的项
HTREEITEM m_htreeChildItem;//下一个子项
HTREEITEM m_htreeSiblingItem;//下一个兄项
HTREEITEM m_htreeParentItem;//下一个父项
m_htreeParentItem=TVI_ROOT;//取得主项
//--------------------------------------------------
//读取总数
GetPrivateProfileString("tre","sum","",itemp,256,"D://x.ini");
sum=atoi(itemp);
//循环所有项目 根据父项的标识来确定位置
for (int i=1;i<=sum;i++)
{
//取得当前项的父项标识
temp_01.Format("%d",i);
GetPrivateProfileString("tree","id_parent_"+temp_01,"",itemp,256,"D://x.ini");
bs=atoi(itemp);
//如果在下一节点上
if (bs>parent)
{
m_htreeBS = m_tree_map_list.InsertItem("tree",0,1,m_htreeParentItem,TVI_LAST);
m_htreeParentItem=m_htreeBS;
parent++;
//如果在此节点上
}else if (bs==parent)
{
m_htreeSiblingItem = m_tree_map_list.GetParentItem(m_htreeParentItem);
m_htreeBS = m_tree_map_list.InsertItem("tree",0,1,m_htreeSiblingItem,TVI_LAST);
m_htreeParentItem=m_htreeBS;
//如果在上一节点上
}else if(bs<parent)
{
//循环至当前项的父项标识为止
while(bs!=parent)
{
m_htreeBS = m_tree_map_list.GetParentItem(m_htreeBS);
parent--;
}
m_htreeBS = m_tree_map_list.GetParentItem(m_htreeBS);
m_htreeBS = m_tree_map_list.InsertItem("tree",0,1,m_htreeBS,TVI_LAST);
m_htreeParentItem=m_htreeBS;
}
}
天枫十一郎.2006