如何在生成CTreeCtrl的节点时,在每个节点里保存一个int型的值和一个字符串数组。

nodefault 2006-02-16 09:59:39
如何在生成CTreeCtrl的节点时,在每个节点里保存一个int型的值和一个字符串数组。是不是要定义一个结构体,用结构体指针保存到InsertItem的lParam域?
typedef struct
{
int iType;
char *sCRCtrl[3]={"SccpId1","SccpId2","SccpId3"};
}nCar_T;

nCar_T *temStru;


HTREEITEM hPA = pCtrl->InsertItem(TVIF_TEXT,
_T("Pennsylvania"), 0, 0, 0, 0, 0, (LPARAM )temStru, NULL);

请大家给我改改代码!!!

我想用
HTREEITEM InsertItem(
UINT nMask,
LPCTSTR lpszItem,
int nImage,
int nSelectedImage,
UINT nState,
UINT nStateMask,
LPARAM lParam,
HTREEITEM hParent,
HTREEITEM hInsertAfter
);
...全文
277 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
nodefault 2006-02-17
  • 打赏
  • 举报
回复
我的问题和帖子很相似:
http://community.csdn.net/Expert/topic/4497/4497846.xml?temp=.7383386
目的: 点击节点时弹出一个对话框。
当节点保存的结构体的域iType为0时,说明是枚举类型的。把枚举的字符串数组传到对话框中去。用户选择完后,对话框的值在保存回CtreeCtrl。
当节点保存的结构体的域iType为1时,说明是BYTE型的。用户在对话框输入完成后,把值在保存回CtreeCtrl。
当节点保存的结构体的域iType为2时,说明是CString型的。用户在对话框输入完成后,把值在保存回CtreeCtrl。
注意:iType为1或2时是不需要有枚举类型的字符串域的。

我的结构体似乎还要加一个保存节点现有值的域.iCurValue根据第一个域分别定义成int,BYTE和 char *类型的。
typedef struct
{
int iType;
int iCurValue; //保存节点现有值的域
char *sCRCtrl[3]={"SccpId1","SccpId2","SccpId3"};
}nCar_T;

请问这种方案合理吗?有没有更好的方法?



striking 2006-02-17
  • 打赏
  • 举报
回复
HTREEITEM hti = m_tree.InsertItem("text");

nCar_T *temStru = new nCar_T();
//设置temStru的内容...

//保存到相应的结点
SetItemData(hti,reinterpret_cast<DWORD>(temStru ));

//从结点取回,先取得结点的HTREEITEM
nCar_T *temStru = reinterpret_cast<nCar_T *>GetItemData(hti));//
菜牛 2006-02-17
  • 打赏
  • 举报
回复
一样的。
nodefault 2006-02-17
  • 打赏
  • 举报
回复
SetItemData的dwData域:A 32-bit application-specific value associated with the item specified by hItem
InsertItem中的lParam域:A 32-bit application-specific value associated with the item.
我想他们应该是一样的吧?
Kudeet 2006-02-17
  • 打赏
  • 举报
回复
SetItemData可以保存一个DWORD的值,你可以自己new一个结构,把这个结构的地址用itemdata保存
gao_ming77 2006-02-17
  • 打赏
  • 举报
回复
你看他的例子只有TVIF_TEXT,你需要这样写
m_msgTree.InsertItem(TVIF_TEXT|TVIF_PARAM,str,0,0,0,0, reinterpret_cast<DWORD>(sccpIdStru),hTrItem, NULL);
gao_ming77 2006-02-17
  • 打赏
  • 举报
回复
呵呵,MSDN的例子没有要设置ItemData呀。
nodefault 2006-02-17
  • 打赏
  • 举报
回复
我是参照msdn上的写法了。你在看看:
ms-help://MS.MSDNQTR.2005JAN.1033/vclib/html/_mfc_CTreeCtrl.3a3a.InsertItem.htm

微软能这么写,我为什么不能这么写啊?
HTREEITEM hPA = pCtrl->InsertItem(TVIF_TEXT,
_T("Pennsylvania"), 0, 0, 0, 0, 0, hCountry, NULL);
gao_ming77 2006-02-17
  • 打赏
  • 举报
回复
m_msgTree.InsertItem(TVIF_TEXT,str,0,0,0,0, reinterpret_cast<DWORD>(sccpIdStru),hTrItem, NULL);这样写参数有错误,其中的nstatemask,你看看msdn。你需要设置上TVIF_PARAM
nodefault 2006-02-17
  • 打赏
  • 举报
回复
问题解决了!换个写法就对了!

m_msgTree.InsertItem(TVIF_TEXT,str,0,0,0,0, reinterpret_cast<DWORD>(sccpIdStru),hTrItem, NULL);

改写为:
HTREEITEM hItem =m_msgTree.InsertItem(str,hTrItem);
m_msgTree.SetItemData(hItem,(DWORD)sccpIdStru);

这是为什么呀?
kikikind 2006-02-17
  • 打赏
  • 举报
回复
使用CTreeCtrl,TVITEM 一定要设定mask的值~~~
比如你用到 lparam ,就要设定 TVIF_PARAM 参数
InsertItem也一样~~~不然会有不知名的错误!
看看TVITEM 的说明
nodefault 2006-02-17
  • 打赏
  • 举报
回复
在CRCtrl_szSccpId_T *pSccpId_T = (CRCtrl_szSccpId_T *)m_msgTree.GetItemData (hSelectedNode);返回NULL。
pomelowu 2006-02-17
  • 打赏
  • 举报
回复
还是在CRCtrl_szSccpId_T *pSccpId_T = (CRCtrl_szSccpId_T *)m_msgTree.GetItemData (hSelectedNode);返回NULL?
pomelowu 2006-02-17
  • 打赏
  • 举报
回复
HTREEITEM hSelectedNode = m_msgTree.GetSelectedItem();
这个地方返回NULL?
gao_ming77 2006-02-17
  • 打赏
  • 举报
回复
是不是你所有的tree节点都调用了setitemdata呢?
建议你加上这么一句
if(pSccpId_T && pSccpId_T->iCurValue){
...
}
nodefault 2006-02-17
  • 打赏
  • 举报
回复
我是楼主!遇到以下问题:
void CStepPage::OnDblclkMsgTree(NMHDR* pNMHDR, LRESULT* pResult)
{

HTREEITEM hSelectedNode = m_msgTree.GetSelectedItem();
CRCtrl_szSccpId_T *pSccpId_T = (CRCtrl_szSccpId_T *)m_msgTree.GetItemData (hSelectedNode);
if(pSccpId_T->iCurValue); //为什么会出现访问非法错误?
{
.........
}
gao_ming77 2006-02-17
  • 打赏
  • 举报
回复
你为什么不把struct保存到树结点?
保存:
HTREEITEM hItem = CtreeCtrl.InsertItem(...);
nCar_T *data = new nCar_T;
//set data field.
CtreeCtrl.SetItemData(hItem,(DWORD)data);

取数据
nCar_T *data = (nCar_T*)CtreeCtrl.GetItemData(hItem)
//get data field

还有,就是你的struct是否可以定义为
typedef struct
{
int iType;
const char* sCRCtrl[3]={"SccpId1","SccpId2","SccpId3"};
union{
BYTE byCurValue;
int iCurValue;
char* szCurValue;
}

}
BombZhang 2006-02-16
  • 打赏
  • 举报
回复
我刚看到标题的时候马上想到的就是这个方法,
指针对应的结构体变量的对象在树控件存在期间一定确保有效
DentistryDoctor 2006-02-16
  • 打赏
  • 举报
回复
定义一个结构体,用结构体指针保存到InsertItem的lParam域!
是这样的。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧