CTreeCtrl 如何用SetItemData使Item保持额外数据?
糊糊 2006-02-20 11:18:45 主 题: CTreeCtrl 如何用SetItemData使Item保持额外数据?
作 者: huyoo (空格键)
还是先看看下面我写的代码吧~~
定义了两个数据类型
一个枚举类型,ITEM_TYPE
typedef enum tagITEM_TYPE
{
//数据类型
TYPE_TYPE_FOLDER=1,TYPE_FILE
}ITEM_TYPE;
一个数据结构,用来定义额外数据
struct Extra_DATA
{
//Extra 数据
ITEM_TYPE type;
LPCTSTR url;
};
想问一下,我下面的操作,为什么不能使使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/destruction
CExtraTreeView::CExtraTreeView()
{}
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 handlers
BOOL 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;
}