还是先看看下面我写的代码吧~~
定义了两个数据类型
一个枚举类型,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;}
定义了两个数据类型
一个枚举类型,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;}
一个数据结构,用来定义额外数据
struct Extra_DATA
{
//Extra 数据
ITEM_TYPE type;
LPCTSTR url;//《----这里改改
};
this->GetTreeCtrl().SetItemData(TempItem2,(DWORD)node);
delete node;//此处不能释放该node,应该在删除节点的时候释放
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
this->GetTreeCtrl().SetItemData(TempItem2,(DWORD)node);
delete node;//此处不能释放该node,应该在删除节点的时候释放
--------------------------
我不想删除节点,我只想删除那个node占用的内存,让该死的treeitem自己保持数据。