还是先看看下面我写的代码吧~~
定义了两个数据类型
一个枚举类型,ITEM_TYPE
typedef enum tagITEM_TYPE
{
  //数据类型
  TYPE_TYPE_FOLDER=1,TYPE_FILE
}ITEM_TYPE;一个数据结构,用来定义额外数据
struct Extra_DATA
{
//Extra 数据
ITEM_TYPE type;
LPCTSTR link;
};想问一下,我下面的操作,为什么不能使使Item保持额外数据?
难道Item自己没有空间保持额外数据吗?非得要给那些数据分配一些内存?// ExtraTreeView.cpp : implementation of the CExtraTreeView class
//#include "stdafx.h"
#include "Extratest.h"#include "ExtratestDoc.h"
#include "ExtraTreeView.h"
#include "MainFrm.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CExtraTreeView
typedef enum tagITEM_TYPE
{
  //数据类型
  TYPE_TYPE_FOLDER=1,TYPE_FILE
}ITEM_TYPE;struct Extra_DATA
{
//Extra 数据
ITEM_TYPE type;
LPCTSTR link;
};
extern CExtratestApp theApp;IMPLEMENT_DYNCREATE(CExtraTreeView, CTreeView)BEGIN_MESSAGE_MAP(CExtraTreeView, CTreeView)
  //{{AFX_MSG_MAP(CExtraTreeView)
  ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
  //}}AFX_MSG_MAP
  // Standard printing commands
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CExtraTreeView construction/destructionCExtraTreeView::CExtraTreeView()
{
  // TODO: add construction code here}CExtraTreeView::~CExtraTreeView()
{
}void CExtraTreeView::OnInitialUpdate()
{
  CTreeView::OnInitialUpdate();  // TODO: You may populate your TreeView with items by directly accessing
  //  its tree control through a call to GetTreeCtrl().
  BuildExtraTreeView(this->m_hWnd);
}/////////////////////////////////////////////////////////////////////////////
// CExtraTreeView message handlersBOOL CExtraTreeView::BuildExtraTreeView(HWND hWnd)
{
 HTREEITEM ht;
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 
 Extra_DATA *node = new Extra_DATA();
 node->type=TYPE_FOLDER;
 node->url=TEXT("");
 ht=this->GetTreeCtrl().InsertItem(TEXT("我的Extra数据"),0,0,TVI_ROOT,TVI_LAST);    
 this->GetTreeCtrl().SetItemData(ht,(DWORD)node);
 delete node;
 //wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
 
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 
node = new Extra_DATA(); node->type=HTTPLINK;
 node->url=TEXT("http://blog.csdn.net/huyoo");
HTREEITEM TempItem1=this->GetTreeCtrl().InsertItem("url11111111111",  ht, TVI_LAST);
this->GetTreeCtrl().SetItemData(TempItem1,(DWORD)node);
delete node;
//wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
node = new Extra_DATA(); node->type=HTTPLINK;
 node->url=TEXT("http://blog.csdn.net");
HTREEITEM TempItem2=this->GetTreeCtrl().InsertItem("url22222222222222",  ht, TVI_LAST);
this->GetTreeCtrl().SetItemData(TempItem2,(DWORD)node);
delete node;
//wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
//url="http://blog.csdn.net/huyoo";
 node->type=HTTPLINK;
 node->url=TEXT("http://www.csdn.net");
HTREEITEM TempItem3=this->GetTreeCtrl().InsertItem("url333333333333333",  ht, TVI_LAST);
this->GetTreeCtrl().SetItemData(TempItem3,(DWORD)node);
//wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
return TRUE;}void CExtraTreeView::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
  CString aurl;
  HTREEITEM Item = this->GetTreeCtrl().GetSelectedItem();
   if (!Item)
      return;   Extra_DATA *node = (Extra_DATA *) this->GetTreeCtrl().GetItemData(Item);
//  if(node->type == TYPE_FOLDER)
//  {
//    return;
//  }
//  else
  {
     aurl = LPCTSTR(node->url); //这里取不到TreeCtrl中的额外数据!!!!!
  }
  CMainFrame * pmain=(CMainFrame*)AfxGetMainWnd();
  pmain->SetWindowText(aurl);
  *pResult = 0;}

解决方案 »

  1.   

    定义错了一点,应该是url,不是link,意思一样。
    一个数据结构,用来定义额外数据
    struct Extra_DATA
    {
    //Extra 数据
    ITEM_TYPE type;
    LPCTSTR url;//《----这里改改
    };
      

  2.   

    HTREEITEM TempItem2=this->GetTreeCtrl().InsertItem("url22222222222222",  ht, TVI_LAST);
    this->GetTreeCtrl().SetItemData(TempItem2,(DWORD)node);
    delete node;//此处不能释放该node,应该在删除节点的时候释放
      

  3.   

    你SetItemData之后将其删除了,这样它引用的就是无效数据了,这样可能会引起程序的崩溃。
      

  4.   

    You should not delete the item data when it is being used by an item;
    handle TVN_DELETEITEM to delete the itemdata when it is no longer used.BTW, you need to reconsider if you need a tree control at all. Tree control sends several messages for each item. Destroying 40,000 items entails 40,000 TVN_DELETEITEM notifications. Just by sheer numbers that's going to take a while. 40,000 items in a treeview is unusably excessive.Suggest reading:
    http://www.codeproject.com/treectrl/waitingtreectrl.asp
      

  5.   

    HTREEITEM TempItem2=this->GetTreeCtrl().InsertItem("url22222222222222",  ht, TVI_LAST);
    this->GetTreeCtrl().SetItemData(TempItem2,(DWORD)node);
    delete node;//此处不能释放该node,应该在删除节点的时候释放
    --------------------------
    我不想删除节点,我只想删除那个node占用的内存,让该死的treeitem自己保持数据。