CTreeCtrl项目的保存与读取

     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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值