在大家的帮助下,我做了个类似QQ用户列表的树形控件,并且能对其进行添加,删除,改名的操作。
主要代码:
-----------------------------------------------------------------------------------------------------
HTREEITEM GroupItem;
HTREEITEM FriendItem;
typedef struct {
CString nickname;
HTREEITEM FriendItem2;
} Friend; typedef struct
{
CString name;
HTREEITEM GroupItem2;
}Group; BOOL CShuDlg::OnInitDialog()
{
        InitTreeCtrl();
}void CShuDlg::InitTreeCtrl()         //刚刚开始的两个组:我的好友 与 陌生人 。
{
TV_INSERTSTRUCT curltem; curltem.hParent=TVI_ROOT;
curltem.hInsertAfter=TVI_SORT;
curltem.item.mask=TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
curltem.item.iImage=0;
curltem.item.iSelectedImage=0;
curltem.item.pszText =_T("我的好友");
GroupItem=m_TreeFile.InsertItem(&curltem); m_TreeFile.Expand(GroupItem,TVE_EXPAND);

curltem.hParent = TVI_ROOT;
curltem.hInsertAfter = TVI_LAST;
curltem.item.iImage  = 1;
curltem.item.iSelectedImage = 1;
curltem.item.mask=TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
curltem.item.pszText =_T("陌生人"); 
GroupItem=m_TreeFile.InsertItem(&curltem);
}void CShuDlg::OnjiazuBUTTON() //加组操作
{
// TODO: Add your control notification handler code here TV_INSERTSTRUCT tvInsert;
tvInsert.hParent = TVI_ROOT;
tvInsert.hInsertAfter = TVI_LAST;
tvInsert.item.mask=TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvInsert.item.iImage=0;
tvInsert.item.iSelectedImage=0;
tvInsert.item.pszText = _T("请输入组名"); GroupItem = m_TreeFile.InsertItem(&tvInsert);
ASSERT(GroupItem!=NULL);
   
CEdit* pEdit = m_TreeFile.EditLabel(GroupItem);
ASSERT(pEdit != NULL);
}
void CShuDlg::OnjiarenBUTTON() //加好友操作
{
// TODO: Add your control notification handler code here
HTREEITEM AddFriend = m_TreeFile.GetSelectedItem();
if(m_TreeFile.GetParentItem(AddFriend) == NULL)
{
TV_INSERTSTRUCT friendInsert;
friendInsert.hParent = AddFriend;
friendInsert.hInsertAfter = TVI_LAST;
friendInsert.item.iImage=2;
friendInsert.item.iSelectedImage=2;
friendInsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE| TVIF_TEXT;
friendInsert.item.pszText = _T("添加的人");
FriendItem=m_TreeFile.InsertItem(&friendInsert); ASSERT(FriendItem!=NULL);
   
CEdit* pEdit = m_TreeFile.EditLabel(FriendItem);
ASSERT(pEdit != NULL);
}
else
{
AfxMessageBox("请现在正确的分组");
}}void CShuDlg::OnBeginlabeleditTreeDir(NMHDR* pNMHDR, LRESULT* pResult) 
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here *pResult = 0;
}void CShuDlg::OnEndlabeleditTreeDir(NMHDR* pNMHDR, LRESULT* pResult) 
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
CString  strName;
*pResult = 1;
// *pResult = 0; 
}
void CShuDlg::OnButtonDeletefriend()   //删除好友操作
{
// TODO: Add your control notification handler code here
HTREEITEM DeleteFriend = m_TreeFile.GetSelectedItem();
 if(m_TreeFile.GetParentItem(DeleteFriend) != NULL)
{
               m_TreeFile.DeleteItem(DeleteFriend);
}

}
void CShuDlg::OnButtonDeletegroup()   //删除组操作
{
// TODO: Add your control notification handler code here
HTREEITEM DeleteGroup = m_TreeFile.GetSelectedItem();
if(m_TreeFile.GetParentItem(DeleteGroup) == NULL)
{
         m_TreeFile.DeleteItem(DeleteGroup);
}}
-----------------------------------------------------------------------------------------------------
以上的已经实现添加,删除的操作。
现在我想对加入进来的好友,及组的信息进行保存。保存好友的昵称:Friend Haoyou.nickname,与组名Group Zu.name就好了。接下来应该怎么做呢?或者提供个方案!希望大家踊跃发言啊。在线等……

解决方案 »

  1.   

    没人来帮我下吗??
    急需知道啊。。谢谢啊现在我想对加入进来的好友,及组的信息进行保存。保存好友的昵称:Friend   Haoyou.nickname,与组名Group   Zu.name就好了。接下来应该怎么做呢?或者提供个方案! 
      

  2.   

    将昵称与组名取出来,
    写文件,ini xml都可以啊
      

  3.   

    我现在是这样子的: 比如现对组进行操作:
    定义:
    typedef struct
    {
    CString  name; //组名
    HTREEITEM Item;

    }Group; //分组Group Groups[20]; //结构体数组现在我想实现的功能是:
    现在增加个组( OnjiazuBUTTON()   //加组操作 ),保存他的name;
    Groups[1].name=strName        //strName=我第1次加的组
    增加第二个组( OnjiazuBUTTON()   //加组操作 ),保存他的name;
    Groups[2].name=strName        //strName=我第2次加的组
    这样子加下去问:怎么实现 ①:每增加个组,Groups[i]中i自动加1 ? 
    ②:加1前,怎么判断已有几个组存在?.是不是在 void   CShuDlg::OnEndlabeleditTreeDir(NMHDR*   pNMHDR,   LRESULT*   pResult) 来实现的?
    知道的人请回答,帮帮忙`! 谢谢
      

  4.   

    LZ的意思是动态添加组,可以使用STL中的vectorvector.size()即可取出当前组个数iterator为当前vector的索引添加时只要 vector.push_back() 即可MFC的CTypedPtrList CTypedPtrArray这两个模板类应该也可以
    OnEndlabeleditTreeDir 编辑完树节点标签?添加的时机应该是你确定,可能数据来源于网络,而不一定是编辑后取得.
      

  5.   

    恩 是的啊,可是我现在还不知道 STL中的vector ?还有CtreeCtrl中的GetCount()是得到所有树形项目的数量.   有没有得到根项目数量的操作啊?没有的话,有什么实现方法来实现 得到根项目数量 .我这个树形控件就两层, 组与用户.
      

  6.   

    thunder://QUFodHRwOi8vZWJvb2suMDAwODMuY29tL3VwbG9hZHNvZnQvYysrcHJpbWVy1tDOxLDmKLXaNLDmKS5yYXI/MTI0MDI2MDk3NDAyODQ0eDExOTU2MzI2ODJ4MTI0MDI2MTAyMzg4OTIwLThhNWJkYzk1NzI2MThjNDMxMmNhOGY5NWQwMzdlMTU5Wlo=C++Primer中文版(第4版).pdf 90M第三章有关于vector的详细介绍
    vector.size()即可取出当前组个数同时你可以嵌套定义vector,以便将(成员)定义进(组)的数据结构,就像这样typedef   struct   { 
    CString   nickname; 
    HTREEITEM   FriendItem2; 
    }   Friend; typedef   struct 

    CString   name; 
    HTREEITEM   GroupItem2;
      Friend *friend;
    }Group;
      

  7.   

    建议用xml,网上有个CMarkup类,可以搜搜看